const express = require('express'); const fs = require('fs'); const path = require('path'); const multiparty = require('multiparty'); const router = express.Router(); // Limite de taille de fichier à 10 Go const MAX_FILE_SIZE = 10 * 1024 * 1024 * 1024; // 10 Go // Crée le dossier temporaire à la racine s'il n'existe pas const tempDir = path.join(process.cwd(), 'temp'); if (!fs.existsSync(tempDir)) { fs.mkdirSync(tempDir, { recursive: true }); } router.post('/', (req, res) => { const form = new multiparty.Form({ uploadDir: tempDir, maxFilesSize: MAX_FILE_SIZE, }); form.parse(req, (err, fields, files) => { if (err) { console.error('Error parsing the file:', err); return res.status(400).send('Error during the file upload'); } if (!files.file || files.file.length === 0) { return res.status(400).send('No file uploaded'); } const file = files.file[0]; // Modifier le chemin pour être relatif à la racine const userDir = path.join(process.cwd(), 'cdn-files', req.user.name); // Utiliser le nom sécurisé fourni par le client const filename = fields.filename ? fields.filename[0] : file.originalFilename; const filePath = path.join(userDir, filename); // Crée le répertoire s'il n'existe pas if (!fs.existsSync(userDir)) { fs.mkdirSync(userDir, { recursive: true }); } // Lecture en chunks pour plus de performances const readStream = fs.createReadStream(file.path, { highWaterMark: 1024 * 1024 }); const writeStream = fs.createWriteStream(filePath, { flags: 'a' }); readStream.pipe(writeStream); readStream.on('end', () => { // Supprimer le fichier temporaire fs.unlinkSync(file.path); // Vérifier que le nom du fichier suit bien le format attendu const fileNamePattern = /^\d{8}_[A-Z0-9]{6}_.*$/; if (!fileNamePattern.test(filename)) { console.warn('Le fichier uploadé ne suit pas le format de nom sécurisé attendu:', filename); } res.status(200).send({ message: 'File uploaded successfully.', filename: filename }); }); readStream.on('error', (err) => { console.error('Error reading the file:', err); // Nettoyer le fichier temporaire en cas d'erreur if (fs.existsSync(file.path)) { fs.unlinkSync(file.path); } res.status(500).send({ message: 'Error uploading file.' }); }); writeStream.on('error', (err) => { console.error('Error writing the file:', err); // Nettoyer le fichier temporaire en cas d'erreur if (fs.existsSync(file.path)) { fs.unlinkSync(file.path); } res.status(500).send({ message: 'Error uploading file.' }); }); }); }); module.exports = router;