fix crash when non-formalized files are uploaded

This commit is contained in:
srgooglo 2022-10-10 15:55:58 +02:00
parent ef9383c734
commit fced4cdc04

View File

@ -11,6 +11,7 @@ const formidable = require("formidable")
const maximumFileSize = 80 * 1024 * 1024 // max file size in bytes (80MB) By default, the maximum file size is 80MB. const maximumFileSize = 80 * 1024 * 1024 // max file size in bytes (80MB) By default, the maximum file size is 80MB.
const maximunFilesPerRequest = 20 const maximunFilesPerRequest = 20
const acceptedMimeTypes = [ const acceptedMimeTypes = [
"image/jpg",
"image/jpeg", "image/jpeg",
"image/png", "image/png",
"image/gif", "image/gif",
@ -20,6 +21,7 @@ const acceptedMimeTypes = [
"audio/wav", "audio/wav",
"audio/flac", "audio/flac",
"video/mp4", "video/mp4",
"video/mkv",
"video/webm", "video/webm",
"video/quicktime", "video/quicktime",
"video/x-msvideo", "video/x-msvideo",
@ -27,6 +29,16 @@ const acceptedMimeTypes = [
] ]
export default class FilesController extends Controller { export default class FilesController extends Controller {
get = {
"/upload/uploadPolicy": () => {
return {
acceptedMimeTypes,
maximumFileSize,
maximunFilesPerRequest,
}
},
}
post = { post = {
"/upload": { "/upload": {
middlewares: ["withAuthentication"], middlewares: ["withAuthentication"],
@ -45,6 +57,13 @@ export default class FilesController extends Controller {
uploadDir: global.uploadCachePath, uploadDir: global.uploadCachePath,
maxFileSize: maximumFileSize, maxFileSize: maximumFileSize,
maxFields: maximunFilesPerRequest, maxFields: maximunFilesPerRequest,
filename: (name, ext) => {
name = name.trim()
name = name.replace(/ /g, "_")
name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
return name + ext
},
filter: (stream) => { filter: (stream) => {
// check if is allowed mime type // check if is allowed mime type
if (!acceptedMimeTypes.includes(stream.mimetype)) { if (!acceptedMimeTypes.includes(stream.mimetype)) {
@ -96,18 +115,17 @@ export default class FilesController extends Controller {
} }
const metadata = { const metadata = {
originalFilename: file.originalFilename,
mimetype: file.mimetype, mimetype: file.mimetype,
size: file.size, size: file.size,
filepath: file.filepath, filepath: file.filepath,
newFilename: file.newFilename, filename: file.newFilename,
} }
// upload to s3 // upload to s3
await new Promise((_resolve, _reject) => { await new Promise((_resolve, _reject) => {
global.storage.fPutObject(global.storage.defaultBucket, file.newFilename, file.filepath, metadata, (err, etag) => { global.storage.fPutObject(global.storage.defaultBucket, file.newFilename, file.filepath, metadata, (err, etag) => {
if (err) { if (err) {
return _reject("Failed to upload file to storage server") return _reject(new Error(`Failed to upload file to storage server > ${err.message}`))
} }
return _resolve() return _resolve()