Skip to content

Commit 68f3d6f

Browse files
committed
fix: express and multer type conflict in file uploader
1 parent 0bdb54d commit 68f3d6f

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

src/app/middlewares/fileUploadHandler.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { Request } from 'express';
1+
import { NextFunction, Request, Response, RequestHandler } from 'express';
22
import fs from 'fs';
33
import { StatusCodes } from 'http-status-codes';
44
import multer, { FileFilterCallback } from 'multer';
55
import path from 'path';
66
import ApiError from '../../errors/ApiError';
77

8-
const fileUploadHandler = () => {
8+
const fileUploadHandler = (): RequestHandler => {
99
//create upload folder
1010
const baseUploadDir = path.join(process.cwd(), 'uploads');
1111
if (!fs.existsSync(baseUploadDir)) {
@@ -22,7 +22,7 @@ const fileUploadHandler = () => {
2222
//create filename
2323
const storage = multer.diskStorage({
2424
destination: (req, file, cb) => {
25-
let uploadDir;
25+
let uploadDir: string;
2626
switch (file.fieldname) {
2727
case 'image':
2828
uploadDir = path.join(baseUploadDir, 'image');
@@ -60,11 +60,7 @@ const fileUploadHandler = () => {
6060
cb: FileFilterCallback
6161
) => {
6262
if (file.fieldname === 'image') {
63-
if (
64-
file.mimetype === 'image/jpeg' ||
65-
file.mimetype === 'image/png' ||
66-
file.mimetype === 'image/jpg'
67-
) {
63+
if (['image/jpeg', 'image/png', 'image/jpg'].includes(file.mimetype)) {
6864
cb(null, true);
6965
} else {
7066
cb(
@@ -75,7 +71,7 @@ const fileUploadHandler = () => {
7571
);
7672
}
7773
} else if (file.fieldname === 'media') {
78-
if (file.mimetype === 'video/mp4' || file.mimetype === 'audio/mpeg') {
74+
if (['video/mp4', 'audio/mpeg'].includes(file.mimetype)) {
7975
cb(null, true);
8076
} else {
8177
cb(
@@ -104,7 +100,20 @@ const fileUploadHandler = () => {
104100
{ name: 'media', maxCount: 3 },
105101
{ name: 'doc', maxCount: 3 },
106102
]);
107-
return upload;
103+
104+
// wrap Multer upload in a proper Express RequestHandler
105+
return (req: Request, res: Response, next: NextFunction) => {
106+
upload(req as any, res as any, err => {
107+
if (err instanceof ApiError) {
108+
return res.status(err.statusCode).json({ message: err.message });
109+
} else if (err) {
110+
return res
111+
.status(StatusCodes.BAD_REQUEST)
112+
.json({ message: 'File upload error' });
113+
}
114+
next();
115+
});
116+
};
108117
};
109118

110119
export default fileUploadHandler;

0 commit comments

Comments
 (0)