From 1a67ac9bd861f2482e1d285cfa5ad7c4d3aeb235 Mon Sep 17 00:00:00 2001 From: Pau Date: Wed, 14 May 2025 20:41:32 +0200 Subject: [PATCH] attempt at fixing bad file upload --- src/middlewares/upload.js | 37 +++++------------ src/routes/uploadRoutes.js | 83 ++++++++++++++++++++++++++------------ 2 files changed, 68 insertions(+), 52 deletions(-) diff --git a/src/middlewares/upload.js b/src/middlewares/upload.js index 187de7a..6a7cf21 100644 --- a/src/middlewares/upload.js +++ b/src/middlewares/upload.js @@ -11,7 +11,7 @@ if (!fs.existsSync(uploadDir)) { const storage = multer.diskStorage({ destination: (req, file, cb) => { - const userPath = req.body?.path || ''; //optional path from request body + const userPath = req.body?.path || ''; // optional path from request body const normalizedUserPath = path.normalize(userPath).replace(/^(\.\.[\/\\])+/, ''); @@ -21,7 +21,7 @@ const storage = multer.diskStorage({ return cb(new Error('Invalid path.')); } - // Crea el directorio si no existe + // Create directory if it doesn't exist if (!fs.existsSync(targetPath)) { fs.mkdirSync(targetPath, { recursive: true }); } @@ -46,36 +46,19 @@ const fileFilter = (req, file, cb) => { if (extname && mimetype) { cb(null, true); } else { - cb(new multer.MulterError('LIMIT_UNEXPECTED_FILE', file.fieldname)); + cb(new Error(`File type not allowed: ${file.originalname}`)); } }; -const multerUpload = multer({ - storage, - fileFilter, - limits: { fileSize: 1024 * 1024 * 1024 } // 1GB -}); - -const uploadMiddleware = (fieldName, multiple = false) => (req, res, next) => { - const uploader = multiple ? multerUpload.array(fieldName) : multerUpload.single(fieldName); - - uploader(req, res, (err) => { - if (err instanceof multer.MulterError) { - return res.status(400).json({ error: err.message }); - } else if (err) { - return res.status(500).json({ error: 'Internal server error during file upload.' }); - } - - if (!multiple && !req.file) { - return res.status(400).json({ error: `No file uploaded under field "${fieldName}"` }); - } - const result = req.file - - next(result); - }); +const uploadMiddleware = (fieldName, multiple = false) => { + const uploader = multiple + ? multer({ storage, fileFilter, limits: { fileSize: 1024 * 1024 * 10 } }).array(fieldName) // 10MB limit + : multer({ storage, fileFilter, limits: { fileSize: 1024 * 1024 * 10 } }).single(fieldName); + + return uploader; }; export { fileFilter, uploadMiddleware -}; +}; \ No newline at end of file diff --git a/src/routes/uploadRoutes.js b/src/routes/uploadRoutes.js index 2da58aa..77d57bd 100644 --- a/src/routes/uploadRoutes.js +++ b/src/routes/uploadRoutes.js @@ -1,31 +1,64 @@ -import { linkRoutes2 } from '../index.js'; -import { Router } from 'express' +import { Router } from 'express'; import { uploadMiddleware } from '../middlewares/upload.js'; -export default(config) => { - /** - * Express router to mount user related functions on. - * @type {Object} - * @const - * @namespace placeRouter - */ - const router = Router() - const hasAddLinks = config.environment !== 'production' - +export default (config) => { + const router = Router(); + // Single file upload route - router.post( - '/upload', - uploadMiddleware('file'), - (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes2), - (result, req, res, _) => sendOkResponse(result, req, res)); + router.post('/upload', (req, res) => { + uploadMiddleware('file')(req, res, (err) => { + if (err) { + return res.status(400).json({ error: err.message }); + } + + if (!req.file) { + return res.status(400).json({ error: 'No file uploaded' }); + } + + // Format successful response + const fileUrl = `/public/${req.file.filename}`; + return res.status(200).json({ + success: true, + file: { + filename: req.file.filename, + originalname: req.file.originalname, + mimetype: req.file.mimetype, + size: req.file.size, + url: fileUrl + } + }); + }); + }); // Multiple file upload route - router.post( - '/upload-multiple', - uploadMiddleware('file', true), - (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes2), - (result, req, res, _) => sendOkResponse(result, req, res) - ) + router.post('/upload-multiple', (req, res) => { + uploadMiddleware('file', true)(req, res, (err) => { + if (err) { + return res.status(400).json({ error: err.message }); + } + + if (!req.files || req.files.length === 0) { + return res.status(400).json({ error: 'No files uploaded' }); + } + + // Format successful response for multiple files + const filesData = req.files.map(file => { + const fileUrl = `/public/${file.filename}`; + return { + filename: file.filename, + originalname: file.originalname, + mimetype: file.mimetype, + size: file.size, + url: fileUrl + }; + }); + + return res.status(200).json({ + success: true, + files: filesData + }); + }); + }); - return router -} + return router; +} \ No newline at end of file