102 lines
2.5 KiB
JavaScript
102 lines
2.5 KiB
JavaScript
const multer = require('multer');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const { v4: uuidv4 } = require('uuid');
|
|
|
|
// Create uploads directory if it doesn't exist
|
|
const uploadDir = process.env.UPLOAD_DIR || './uploads';
|
|
const documentsDir = path.join(uploadDir, 'documents');
|
|
const profilesDir = path.join(uploadDir, 'profiles');
|
|
const tempDir = path.join(uploadDir, 'temp');
|
|
|
|
[uploadDir, documentsDir, profilesDir, tempDir].forEach(dir => {
|
|
if (!fs.existsSync(dir)) {
|
|
fs.mkdirSync(dir, { recursive: true });
|
|
}
|
|
});
|
|
|
|
// Storage configuration
|
|
const storage = multer.diskStorage({
|
|
destination: (req, file, cb) => {
|
|
let folder = documentsDir;
|
|
|
|
if (req.body.uploadType === 'profile') {
|
|
folder = profilesDir;
|
|
} else if (req.body.uploadType === 'temp') {
|
|
folder = tempDir;
|
|
}
|
|
|
|
cb(null, folder);
|
|
},
|
|
filename: (req, file, cb) => {
|
|
const uniqueId = uuidv4();
|
|
const ext = path.extname(file.originalname);
|
|
const filename = `${uniqueId}${ext}`;
|
|
cb(null, filename);
|
|
}
|
|
});
|
|
|
|
// File filter
|
|
const fileFilter = (req, file, cb) => {
|
|
// Allowed file types
|
|
const allowedTypes = [
|
|
'application/pdf',
|
|
'image/jpeg',
|
|
'image/jpg',
|
|
'image/png',
|
|
'application/msword',
|
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
'application/vnd.ms-excel',
|
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
];
|
|
|
|
if (allowedTypes.includes(file.mimetype)) {
|
|
cb(null, true);
|
|
} else {
|
|
cb(new Error('Invalid file type. Only PDF, JPG, PNG, DOC, DOCX, XLS, XLSX allowed'), false);
|
|
}
|
|
};
|
|
|
|
// Multer upload configuration
|
|
const upload = multer({
|
|
storage: storage,
|
|
limits: {
|
|
fileSize: parseInt(process.env.MAX_FILE_SIZE) || 10 * 1024 * 1024 // 10MB default
|
|
},
|
|
fileFilter: fileFilter
|
|
});
|
|
|
|
// Single file upload
|
|
const uploadSingle = upload.single('file');
|
|
|
|
// Multiple files upload
|
|
const uploadMultiple = upload.array('files', 10); // Max 10 files
|
|
|
|
// Error handler for multer
|
|
const handleUploadError = (err, req, res, next) => {
|
|
if (err instanceof multer.MulterError) {
|
|
if (err.code === 'LIMIT_FILE_SIZE') {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: 'File too large. Maximum size is 10MB'
|
|
});
|
|
}
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: `Upload error: ${err.message}`
|
|
});
|
|
} else if (err) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: err.message
|
|
});
|
|
}
|
|
next();
|
|
};
|
|
|
|
module.exports = {
|
|
uploadSingle,
|
|
uploadMultiple,
|
|
handleUploadError
|
|
};
|