import {Request} from "express"; import multer, {FileFilterCallback} from "multer"; import {db, MediaRow} from "./db"; import {extension} from "./lib"; export type DestinationCallback = (error: Error | null, destination: string) => void export type FileNameCallback = (error: Error | null, filename: string) => void export const fileStorage = multer.diskStorage({ destination: ( request: Request, file: Express.Multer.File, callback: DestinationCallback ): void => { callback(null, __dirname + "/../../uploads"); }, filename: ( request: Request, file: Express.Multer.File, callback: FileNameCallback ): void => { const nameAndExtension = extension(file.originalname); console.log(`Uploading ${file}`); db.all("SELECT * FROM media WHERE path = ?", [nameAndExtension[0] + nameAndExtension[1]], (err: Error, exists: []) => { if (err) { console.log(err); callback(err, null); } if (exists.length != 0) { const suffix = new Date().getTime() / 1000; if (request.body.title == "" || request.body.title == null || request.body.title == undefined) { callback(null, nameAndExtension[0] + "-" + suffix + nameAndExtension[1]); } else { callback(null, request.body.title + "-" + suffix + nameAndExtension[1]); } } else { if (request.body.title == "" || request.body.title == null || request.body.title == undefined) { callback(null, nameAndExtension[0] + nameAndExtension[1]); } else { callback(null, request.body.title + nameAndExtension[1]); } } }); } }); export const allowedMimeTypes = [ "image/png", "image/jpg", "image/jpeg", "image/gif", "image/webp", "video/mp4", "video/mov", "video/webm", "audio/mpeg", "audio/ogg" ]; export const fileFilter = ( request: Request, file: Express.Multer.File, callback: FileFilterCallback ): void => { if (allowedMimeTypes.includes(file.mimetype)) { callback(null, true); } else { callback(null, false); } };