J'ai regardé beaucoup de réponses à cette même question, mais je n'ai pas encore trouvé de solution de travail. J'essaie de créer une application Web dans laquelle vous pouvez télécharger des fichiers en utilisant express et multer, et j'ai un problème qu'aucun fichier n'est télé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>

Une aide très appréciée, cela me rend fou.

16
mlamp 7 mars 2016 à 21:54

6 réponses

Meilleure réponse

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

17
mscdex 7 mars 2016 à 19:22

J'ai mis MA solution (il y en a beaucoup j'imagine et sûrement mieux) pour aider beaucoup de gens comme moi parce que j'ai cherché pendant 1 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);
})
1
Arnaud BOURET 5 nov. 2016 à 17:03

En cas de facteur, essayez de suivre:

  1. Fermez l'onglet facteur de 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 effectuer les étapes ci-dessus pour appeler à nouveau l'API. La raison d'être multer renvoie des cookies appelés connect.sid au client dont il peut avoir besoin dans une communication ultérieure. L'utilisation d'anciens cookies ne téléchargera pas le fichier.

26
Dmitry Shvedov 19 juil. 2016 à 15:23

Pour nous, c'était parce que nous utilisions express-http-proxy pour proxy 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 30 mai 2018 à 20:28

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 10 avril 2017 à 14:20

Oui, votre enctype est faux 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 Patel 5 nov. 2017 à 08:03