web-dev-qa-db-fra.com

multer - req.file toujours indéfini

J'ai examiné de nombreuses réponses à cette question, mais je n'ai pas encore trouvé de solution efficace. J'essaie de créer une application Web sur laquelle vous pouvez télécharger des fichiers en utilisant express et multer, et je rencontre un problème: aucun fichier n'est chargé et req.file est toujours indéfini.

Mon code ci-dessous

'use strict';

var express = require('express');
var path    = require('path');
var multer  = require('multer')
var upload  = multer({ dest: 'uploads/' })

var app = express();
require('dotenv').load();

app.use(express.static(path.join(__dirname, 'main')));

app.post('/upload', upload.single('upl'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
  console.log(req.file);
  res.status(204).end();
})

var port = process.env.PORT || 8080;
app.listen(port,  function () {
    console.log('Node.js listening on port ' + port + '...');
});

La forme

    <form class="uploadForm" action="/upload" method="post" enctype="multipart/formdata">
        <label class="control-label">Select File</label>
        <input name="upl" id="input-1" type="file" class="file">
        <input type="submit" value="submit" />
    </form>

Aide très appréciée, cela me rend folle.

14
mlamp

Votre enctype est légèrement incorrect, il devrait être multipart/form-data au lieu de multipart/formdata.

14
mscdex

En cas de facteur, essayez de suivre:

  1. Fermez l'onglet postman pour l'API
  2. Ouvrez à nouveau un nouvel onglet
  3. Reconstruisez la demande d'API puis envoyez.

Cela peut résoudre le problème. Chaque fois que vous redémarrez le serveur, vous devez suivre les étapes ci-dessus pour rappeler l'API. La raison en est que multer renvoie au client des cookies appelés connect.sid dont il pourrait avoir besoin lors de communications ultérieures. L'utilisation d'anciens cookies ne téléchargera pas le fichier.

22
Mohit Mittal

Oui, votre enctype est fausse et c'est le seul problème. Assurez-vous de corriger votre enctype, sinon vous risquez de ne pas être défini dans req.file ou req.files. 

0
Piyush P

Je mets MA (il y en a beaucoup j'imagine et sûrement mieux) une solution pour aider beaucoup de gens comme moi car j'ai cherché pendant une journée entière ;-(


//JS file on node side

var express = require('express');
var fileUpload = require('express-fileupload');
var fs = require("fs");
var app = express();
console.log('étape 0');
app.use(express.static('mesStatic'));
app.use(fileUpload());
console.log('étape 1');
app.get('/indexFileUpload.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "indexFileUpload.htm" );
})
console.log('étape 2');
app.post('/file_upload', function (req, res) {

   console.log('étape 3');
   console.log('req.files:' , req.files);
   if (!req.files) {
       res.send('No files to upload.');
       return;
   }

   console.log('req.files.file.data:' , req.files.file.data);
   var bufDataFile = new Buffer(req.files.file.data, "utf-8");
   console.log('étape 3.1');
   console.log('__dirname : ' + __dirname);
   fs.writeFile(__dirname + '/file_upload/output.txt', bufDataFile,  function(err) {
      if (err) {
         return console.error(err);
      }
      else {
         console.log("Data written successfully !");
      }      
      console.log('étape 4');
      res.end('Fin OK !!!');  
   })
})
var server = app.listen(8081, function () {
   var Host = server.address().address
   var port = server.address().port

   console.log("Example app listening at http://%s:%s", Host, port);
})
0
Arnaud BOURET

Pour nous, c'était parce que nous utilisions express-http-proxy pour proxyer l'appel avant multer, et nous devions utiliser l'option parseReqBody: false pour envoyer correctement le fichier.

c'est à dire.

app.post('file/upload', proxy(process.env.API_URL, {
  parseReqBody: false,
}))
0
zpr

Fichier HTML,

<form class="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
    <label class="control-label">Select File</label>
    <input name="upl" id="input-1" type="file" class="file">
    <input type="submit" value="submit" />
</form>

app.js

var express=require("express");
var multer=require("multer");
var app=express();
var upload=multer({dest:"uploads/"});
app.post("/upload",upload.single("upl"),function(req,res){
console.log("Uploaded Successfull with filename : "+req.upl.filename);
});
0
Yash Bele