Comment puis-je demander au multer d'accepter des fichiers provenant de plusieurs champs de type de fichier?
J'ai le code suivant qui télécharge un seul fichier, en utilisant multer dans node.js:
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './public/uploads');
},
filename: function (req, file, callback) {
callback(null, file.fieldname + '-' + Date.now());
}
});
var upload = multer({ storage : storage });
app.post('/rest/upload', upload.array('video', 1), function(req, res, next){
...
}
À partir du formulaire suivant, à condition que seul le champ vidéo ait une valeur (si je spécifie les deux, j'obtiens une erreur "Champ inattendu"):
<form action="/rest/upload" method="post" enctype="multipart/form-data">
<label>Video file: </label> <input type="file" name="video"/>
<label>Subtitles file: </label> <input type="file" name="subtitles"/>
<input type="submit"/>
</form>
Il n'est pas clair dans la documentation comment aborder cela? Toute suggestion serait appréciée. BTW J'ai essayé sans succès les variations de paramètres suivantes:
app.post('/rest/upload', [upload.array('video', 1), upload.array('subtitles', 1)] ...
app.post('/rest/upload', upload.array('video', 1), upload.array('subtitles', 1), ...
app.post('/rest/upload', upload.array(['video', 'subtitles'], 1), ...
Ce que vous voulez, c'est upload.fields()
:
app.post('/rest/upload',
upload.fields([{
name: 'video', maxCount: 1
}, {
name: 'subtitles', maxCount: 1
}]), function(req, res, next){
// ...
}
Avez-vous essayé d'utiliser multer (). Any () ?
Utilisation de Multer Télécharger des fichiers à partir de deux champs de formulaires séparés sur des pages différentes Dans cet exemple, j'ai deux champs - CV et image. Reprendre sous une forme et Image sous une autre. Les deux sont sur des pages distinctes. Premières dépendances d'importation
const path = require('path'); // for getting file extension
const multer = require('multer'); // for uploading files
const uuidv4 = require('uuidv4'); // for naming files with random characters
Définissez fileStorage et fileFilter const fileStorage = multer.diskStorage ({destination: (req, file, cb) => {// définition de la destination de l'endroit où le fichier doit être stocké
if (file.fieldname === "resume") { // if uploading resume
cb(null, 'resumes');
} else { // else uploading image
cb(null, 'images');
}
},
filename: (req, file, cb) => { // naming file
cb(null, file.fieldname+"-"+uuidv4()+path.extname(file.originalname));
}
});
const fileFilter = (req, file, cb) => {
if (file.fieldname === "resume") { // if uploading resume
if (
file.mimetype === 'application/pdf' ||
file.mimetype === 'application/msword' ||
file.mimetype === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
) { // check file type to be pdf, doc, or docx
cb(null, true);
} else {
cb(null, false); // else fails
}
} else { // else uploading image
if (
file.mimetype === 'image/png' ||
file.mimetype === 'image/jpg' ||
file.mimetype === 'image/jpeg'
) { // check file type to be png, jpeg, or jpg
cb(null, true);
} else {
cb(null, false); // else fails
}
}
};
Middleware pour multer
app.use(
multer(
{
storage: fileStorage,
limits:
{
fileSize:'2mb'
},
fileFilter: fileFilter
}
).fields(
[
{
name: 'resume',
maxCount: 1
},
{
name: 'image',
maxCount: 1
}
]
)
);
Et puis appelez vos itinéraires. Vous devrez peut-être ajouter une protection ou une authentification csrf avec cela pour des raisons de sécurité. Mais cela devrait bien fonctionner.