10 votes

Faire des choses avec plusieurs fichiers lors de leur téléchargement en utilisant node-formidable avec Express

Télécharger des fichiers avec node-formidable sur Express est aussi simple que ceci

app.post('/upload', function(req, res) {
    // do something with req.files
});

Les fichiers sont maintenant sauvegardés

Le formulaire : (multiple="multiple" est une fonctionnalité HTML5 qui permet aux utilisateurs de sélectionner plusieurs fichiers à télécharger)

<form method="post" enctype="multipart/form-data" action="upload">
    <input type="text" name="title"/>
    <input type="file" name="upload" multiple="multiple"/>
    <input type="submit" value="upload" id="s3form_submit"/>
</form>

Si j'ajoute cette ligne au code de téléchargement

console.log(req.files.upload.path);

Lors du téléchargement d'un fichier, le chemin d'accès apparaît dans la console. Mais lorsque je télécharge plus d'un fichier, la console indique simplement "undefined". Comment puis-je obtenir le journal pour chaque fichier ? En utilisant une boucle for ?

L'exemple de node-formidable sur GitHub enregistre chaque fichier lorsque vous en téléchargez plusieurs : https://github.com/felixge/node-formidable/blob/master/example/upload.js (J'ai essayé d'utiliser ce code dans Express, cela n'a pas fonctionné) Cela fait exactement ce que je veux, mais comment puis-je faire cela dans une application Express ?

13voto

Frode Points 138

Cela fonctionne en déplaçant la ligne ci-dessous au bas de la fonction app.configure. Pour en savoir plus sur l'importance de l'ordre concernant les intergiciels dans Express, cliquez ici : http://expressjs.com/guide.html#middleware

app.use(express.bodyParser({ uploadDir:__dirname + '/public/uploads' }));

Et en utilisant ce gestionnaire :

app.post('/upload', function(req, res){
    var form = new formidable.IncomingForm(),
    files = [],
    fields = [];
    form.on('field', function(field, value) {
        fields.push([field, value]);
    })
    form.on('file', function(field, file) {
        console.log(file.name);
        files.push([field, file]);
    })
    form.on('end', function() {
        console.log('done');
        res.redirect('/forms');
    });
    form.parse(req);
});

3voto

rfunduk Points 15267

Alors req.files pourrait être un tableau. Essayez de faire console.log(req.files) dans le gestionnaire et voir ce que ça donne... Mais je pense que vous feriez mieux de faire comme dans leur exemple. Vous pouvez le faire fonctionner en supprimant simplement l'élément ../test/common en haut et en changeant les constantes en valeurs statiques (par exemple, au lieu de TEST_TMP utiliser __dirname + '/uploads' ).

Le manipulateur :

var form = new formidable.IncomingForm(),
    files = [],
    fields = [];

form.uploadDir = __dirname + '/uploads';

form
  .on('field', function(field, value) {
    console.log(field, value);
    fields.push([field, value]);
  })
  .on('file', function(field, file) {
    console.log(field, file);
    files.push([field, file]);
  })
  .on('end', function() {
    console.log('-> upload done');
    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received fields:\n\n '+util.inspect(fields));
    res.write('\n\n');
    res.end('received files:\n\n '+util.inspect(files));
  });
form.parse(req);

Les fichiers sont maintenant dans __dirname + '/uploads' nommée selon la sortie sur la console (et à la réponse, comme vous pouvez le voir dans le fichier end handler).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X