Pour compléter la réponse de Ccleve, si vous utilisez superagent / express / multer, construisez votre requête multipart du côté frontal en faisant quelque chose comme ceci :
superagent
.post(url)
.accept('application/json')
.field('myVeryRelevantJsonData', JSON.stringify({ peep: 'Peep Peep!!!' }))
.attach('myFile', file);
cf https://visionmedia.github.io/superagent/#multipart-requests .
Du côté express, ce qui a été adopté comme field
se retrouvera dans req.body après avoir fait :
app.use(express.json({ limit: '3MB' }));
Votre itinéraire devrait comprendre quelque chose comme ceci :
const multerMemStorage = multer.memoryStorage();
const multerUploadToMem = multer({
storage: multerMemStorage,
// Also specify fileFilter, limits...
});
router.post('/myUploads',
multerUploadToMem.single('myFile'),
async (req, res, next) => {
// Find back myVeryRelevantJsonData :
logger.verbose(`Uploaded req.body=${JSON.stringify(req.body)}`);
// If your file is text:
const newFileText = req.file.buffer.toString();
logger.verbose(`Uploaded text=${newFileText}`);
return next();
},
...
Une chose à garder à l'esprit cependant est cette note de la doc Multer, concernant le stockage sur disque :
Notez que req.body n'a peut-être pas encore été entièrement rempli. Cela dépend de l'ordre dans lequel le client transmet les champs et les fichiers au serveur.
Je suppose que cela signifie qu'il ne serait pas fiable de, disons, calculer le répertoire/nom de fichier cible sur la base des métadonnées json transmises dans le fichier.
45 votes
Il n'est pas vraiment nécessaire de s'en tenir à l'utilisation de JSON pour disposer d'un service web RESTful. REST est en fait tout ce qui suit les grands principes des méthodes HTTP et quelques autres règles (sans doute non standardisées).