attempt at fixing bad file upload

This commit is contained in:
Pau 2025-05-14 20:41:32 +02:00
parent 94c8b25878
commit 1a67ac9bd8
2 changed files with 68 additions and 52 deletions

View File

@ -21,7 +21,7 @@ const storage = multer.diskStorage({
return cb(new Error('Invalid path.')); return cb(new Error('Invalid path.'));
} }
// Crea el directorio si no existe // Create directory if it doesn't exist
if (!fs.existsSync(targetPath)) { if (!fs.existsSync(targetPath)) {
fs.mkdirSync(targetPath, { recursive: true }); fs.mkdirSync(targetPath, { recursive: true });
} }
@ -46,33 +46,16 @@ const fileFilter = (req, file, cb) => {
if (extname && mimetype) { if (extname && mimetype) {
cb(null, true); cb(null, true);
} else { } else {
cb(new multer.MulterError('LIMIT_UNEXPECTED_FILE', file.fieldname)); cb(new Error(`File type not allowed: ${file.originalname}`));
} }
}; };
const multerUpload = multer({ const uploadMiddleware = (fieldName, multiple = false) => {
storage, const uploader = multiple
fileFilter, ? multer({ storage, fileFilter, limits: { fileSize: 1024 * 1024 * 10 } }).array(fieldName) // 10MB limit
limits: { fileSize: 1024 * 1024 * 1024 } // 1GB : multer({ storage, fileFilter, limits: { fileSize: 1024 * 1024 * 10 } }).single(fieldName);
});
const uploadMiddleware = (fieldName, multiple = false) => (req, res, next) => { return uploader;
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);
});
}; };
export { export {

View File

@ -1,31 +1,64 @@
import { linkRoutes2 } from '../index.js'; import { Router } from 'express';
import { Router } from 'express'
import { uploadMiddleware } from '../middlewares/upload.js'; import { uploadMiddleware } from '../middlewares/upload.js';
export default (config) => { export default (config) => {
/** const router = Router();
* Express router to mount user related functions on.
* @type {Object}
* @const
* @namespace placeRouter
*/
const router = Router()
const hasAddLinks = config.environment !== 'production'
// Single file upload route // Single file upload route
router.post( router.post('/upload', (req, res) => {
'/upload', uploadMiddleware('file')(req, res, (err) => {
uploadMiddleware('file'), if (err) {
(result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes2), return res.status(400).json({ error: err.message });
(result, req, res, _) => sendOkResponse(result, req, res)); }
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 // Multiple file upload route
router.post( router.post('/upload-multiple', (req, res) => {
'/upload-multiple', uploadMiddleware('file', true)(req, res, (err) => {
uploadMiddleware('file', true), if (err) {
(result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes2), return res.status(400).json({ error: err.message });
(result, req, res, _) => sendOkResponse(result, req, res) }
)
if (!req.files || req.files.length === 0) {
return router 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;
} }