94 lines
2.3 KiB
TypeScript
94 lines
2.3 KiB
TypeScript
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);
|
|
}
|
|
};
|
|
|