backend
Multer, et le streaming direct vers le stockage
Multer, et le streaming direct vers le stockage
Multer est le middleware Express/NestJS pour parser le multipart/form-data — le format que les navigateurs utilisent pour les uploads de fichiers. Sans lui, il n'y a aucun moyen intégré d'extraire un fichier d'une soumission de formulaire.
@Post("upload")
@UseInterceptors(FileInterceptor("file"))
uploadDocument(@UploadedFile() file: Express.Multer.File) {
// file.buffer, file.mimetype, file.size, file.originalname
}
Stockage en mémoire, pas sur disque. Pour tout ce qui transmet droit vers le stockage objet, le buffer va directement dans l'appel de stockage — rien ne touche le disque du conteneur, rien à nettoyer, aucun risque que le disque se remplisse sous le trafic d'upload.
Les limites appartiennent à la couche Multer, pas à une vérification après coup :
MulterModule.register({
limits: { fileSize: maxFileSizeBytes },
fileFilter: (req, file, cb) => cb(null, allowedMimeTypes.includes(file.mimetype)),
});
C'est à la fois de l'UX — échouer vite, avant une tentative d'upload — et de la prévention d'abus. Sans limite de taille, un client peut essayer d'uploader quelque chose d'énorme et bouffer la mémoire et la bande passante du serveur avant que quoi que ce soit ne rejette. Je garde la taille max et les types MIME autorisés configurables par palier de plateforme plutôt que codés en dur, exactement pour cette raison.
Ne fais jamais confiance au type MIME déclaré par le client seul. Un client peut renommer un script en .jpg et prétendre image/jpeg. Pour tout ce qui est sensible à la sécurité — reservi publiquement, ou passé par un générateur de vignettes — renifle le vrai contenu côté serveur plutôt que de faire confiance au Content-Type, surtout avant de le traiter.
Le rôle de Multer s'arrête à sortir des octets utilisables de la requête. Le flux qu'il alimente : les limites de taille et de type valident le fichier, il stream vers le stockage, une ligne documents enregistre la clé de stockage, la somme de contrôle et le type MIME, et le service de vignettes le récupère optionnellement. Tout ce qui vient après Multer est le pipeline propre de l'application.