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.'));
}
// Crea el directorio si no existe
// Create directory if it doesn't exist
if (!fs.existsSync(targetPath)) {
fs.mkdirSync(targetPath, { recursive: true });
}
@ -46,33 +46,16 @@ 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) => {
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);
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);
});
return uploader;
};
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';
export default (config) => {
/**
* Express router to mount user related functions on.
* @type {Object}
* @const
* @namespace placeRouter
*/
const router = Router()
const hasAddLinks = config.environment !== 'production'
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)
)
return router
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;
}