import { Request, Response } from "express"; import multer from "multer"; import { storagePut } from "../storage"; import crypto from "crypto"; import path from "path"; // Configuration de multer pour l'upload en mémoire const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 10 * 1024 * 1024, // 10 Mo max }, }); // Middleware pour l'upload d'un seul fichier export const uploadSingle = upload.single("file"); // Handler pour l'upload de fichier vers S3 export async function handleFileUpload(req: Request, res: Response) { try { if (!req.file) { return res.status(400).json({ error: "Aucun fichier fourni" }); } const file = req.file; // Générer un nom de fichier unique const randomSuffix = crypto.randomBytes(8).toString("hex"); const ext = path.extname(file.originalname); const baseName = path.basename(file.originalname, ext); const safeBaseName = baseName.replace(/[^a-zA-Z0-9-_]/g, "_"); const fileName = `${safeBaseName}-${randomSuffix}${ext}`; // Chemin S3 pour les pièces jointes de rappels const s3Key = `rappels-attachments/${fileName}`; // Upload vers S3 const { url, key } = await storagePut( s3Key, file.buffer, file.mimetype ); console.log(`[FileUpload] Fichier uploadé: ${fileName} (${file.size} octets)`); return res.json({ url, key, filename: file.originalname, mimetype: file.mimetype, size: file.size, }); } catch (error) { console.error("[FileUpload] Erreur:", error); return res.status(500).json({ error: "Erreur lors de l'upload du fichier" }); } }