web-dev-qa-db-fra.com

Téléchargement de plusieurs fichiers avec multer, mais à partir de différents champs?

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),  ...
14
Andre M

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){
  // ...
}
26
mscdex

Avez-vous essayé d'utiliser multer (). Any () ?

3
Roman Dibikhin

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.

1
Vinit Khandelwal