storage-upload/api/media/formidable.mjs

79 lines
2.1 KiB
JavaScript
Raw Normal View History

2021-10-11 00:56:22 +00:00
import fs from 'fs'
2022-08-13 21:52:45 +00:00
import { HttpError } from 'flaska'
2021-10-11 00:56:22 +00:00
import formidable from 'formidable'
import config from '../config.mjs'
let lastDateString = ''
let incrementor = 1
function getPrefix() {
const date = new Date()
let prefix = ''
// Generate 'YYYYMMDD_HHMMSS_' prefix
prefix = date
.toISOString()
.replace(/-/g, '')
.replace('T', '_')
.replace(/:/g, '')
.replace(/\..+/, '_')
// Append xx_ if same date is hit multiple times
if (prefix === lastDateString) {
prefix += incrementor.toString().padStart('2', '0') + '_'
incrementor++
} else {
lastDateString = prefix
incrementor = 1
}
return prefix
}
export function uploadFile(ctx, siteName, noprefix = false) {
2021-10-11 00:56:22 +00:00
return new Promise((res, rej) => {
let prefix = ''
2021-10-11 00:56:22 +00:00
var form = new formidable.IncomingForm()
2022-08-13 21:52:45 +00:00
form.uploadDir = `${config.get('uploadFolder')}/${siteName}`
2021-10-11 00:56:22 +00:00
form.maxFileSize = config.get('fileSize')
let siteSize = config.get(`sites:${siteName}:fileSize`)
if (siteSize && typeof(siteSize) === 'number') {
form.maxFileSize = siteSize
}
2021-10-11 00:56:22 +00:00
form.parse(ctx.req, function(err, fields, files) {
if (err) return rej(err)
2022-08-13 21:52:45 +00:00
if (!files || !files.file) return rej(new HttpError(422, 'File in body was missing'))
2021-10-11 00:56:22 +00:00
let file = files.file
let filename = file.name.replace(/ /g, '_')
.replace(/&/g, 'and')
.replace(/'/g, '')
.replace(/"/g, '')
2022-10-17 09:47:03 +00:00
.replace(/\?/g, '')
2021-10-11 00:56:22 +00:00
Object.keys(fields).forEach(function(key) {
try {
fields[key] = JSON.parse(fields[key])
} catch { }
})
ctx.req.body = fields
if (!noprefix || fs.existsSync(`${config.get('uploadFolder')}/${siteName}/${prefix}${filename}`)) {
prefix = getPrefix()
}
fs.rename(files.file.path, `${config.get('uploadFolder')}/${siteName}/${prefix}${filename}`, function(err) {
2021-10-11 00:56:22 +00:00
if (err) return rej(err)
file.path = `${config.get('uploadFolder')}/${siteName}/${prefix}${filename}`
file.filename = `${prefix}${filename}`
2021-10-11 00:56:22 +00:00
return res(file)
})
})
})
}