2016-03-07 1 views
11

J'ai regardé beaucoup de réponses pour cette même question, mais je n'ai pas encore trouvé de solution de travail. J'essaie de faire une application web que 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.multer - req.file toujours undefined

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 fou.

Répondre

10

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

+0

Merci beaucoup! – mlamp

20

En cas de postier, essayez ce qui suit:

  1. Fermer l'onglet postman pour l'API
  2. Ouvrir un nouvel onglet à nouveau
  3. Reconstruire la demande de l'API, puis envoyer.

Cela peut résoudre le problème. Chaque fois que vous redémarrez le serveur, vous devez effectuer les étapes ci-dessus pour rappeler l'API. La raison étant multer renvoie des cookies appelés connect.sid au client dont il peut avoir besoin dans une communication ultérieure. L'utilisation de cookies anciens ne télécharge pas le fichier.

+0

Si un postier est ouvert avec la méthode POST et que certaines données de formulaire modifiées x-www-form-urlencoded n'envoient pas de données multipart/form jusqu'à ce que vous fermiez l'onglet et en ouvriez un nouveau – kolexinfos

+2

Cette réponse est très utile. Je vous remercie. Ouvrez le numéro FYI https://github.com/postmanlabs/postman-app-support/issues/2602 –

+0

MERCI beaucoup pour cela! Je me suis arraché les cheveux en me demandant pourquoi cela ne fonctionnait pas! – user2924127

0

Je mets mon (il y a beaucoup j'imagine et sûrement mieux) solution pour aider beaucoup de gens comme moi parce que je l'ai cherché pendant 1 jour toute ;-(


//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

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

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