2021-10-11 00:56:22 +00:00
|
|
|
import fs from 'fs'
|
|
|
|
import { HttpError } from '../error.mjs'
|
|
|
|
import formidable from 'formidable'
|
|
|
|
import config from '../config.mjs'
|
|
|
|
|
2022-01-05 14:47:51 +00:00
|
|
|
let lastDateString = ''
|
|
|
|
let incrementor = 1
|
|
|
|
|
2022-01-06 09:01:10 +00:00
|
|
|
export function uploadFile(ctx, siteName, noprefix = false) {
|
2021-10-11 00:56:22 +00:00
|
|
|
return new Promise((res, rej) => {
|
|
|
|
const date = new Date()
|
|
|
|
|
2022-01-06 09:01:10 +00:00
|
|
|
let prefix = ''
|
|
|
|
|
|
|
|
if (!noprefix) {
|
|
|
|
// 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
|
|
|
|
}
|
2022-01-05 14:47:51 +00:00
|
|
|
}
|
|
|
|
|
2021-10-11 00:56:22 +00:00
|
|
|
var form = new formidable.IncomingForm()
|
|
|
|
form.uploadDir = `./public/${siteName}`
|
|
|
|
form.maxFileSize = config.get('fileSize')
|
|
|
|
|
|
|
|
form.parse(ctx.req, function(err, fields, files) {
|
|
|
|
if (err) return rej(err)
|
|
|
|
if (!files || !files.file) return rej(new HttpError('File in body was missing', 422))
|
|
|
|
let file = files.file
|
|
|
|
|
2022-01-05 14:47:51 +00:00
|
|
|
Object.keys(fields).forEach(function(key) {
|
|
|
|
try {
|
|
|
|
fields[key] = JSON.parse(fields[key])
|
|
|
|
} catch { }
|
|
|
|
})
|
|
|
|
ctx.req.body = fields
|
|
|
|
|
2021-10-11 00:56:22 +00:00
|
|
|
fs.rename(files.file.path, `./public/${siteName}/${prefix}${file.name}`, function(err) {
|
|
|
|
if (err) return rej(err)
|
|
|
|
file.path = `./public/${siteName}/${prefix}${file.name}`
|
|
|
|
file.filename = `${prefix}${file.name}`
|
|
|
|
|
|
|
|
return res(file)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|