2016-03-07 16 views
11

Ho visto molte risposte per questa stessa domanda, ma non ho ancora trovato una soluzione funzionante. Sto provando a creare un'app Web che consenta di caricare file utilizzando express e multer e sto riscontrando un problema che nessun file viene caricato e req.file è sempre indefinito.multer - req.file sempre indefinito

mio codice qui sotto

'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 forma

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

Aiuto molto apprezzato, questo mi sta facendo impazzire.

risposta

10

Il tuo enctype è leggermente errato, dovrebbe essere multipart/form-data anziché multipart/formdata.

+0

Grazie mille! – mlamp

20

In caso di postino, prova a seguire:

  1. chiudere la scheda postino per l'API
  2. Aprire una nuova scheda di nuovo
  3. ricostruire la richiesta API e quindi inviare.

Questo potrebbe risolvere il problema. Ogni volta che riavvii il server devi eseguire i passaggi precedenti per chiamare di nuovo l'API. Il motivo per cui multer rimanda alcuni cookie chiamati connect.sid al client che potrebbe richiedere in ulteriore comunicazione. L'utilizzo di cookie obsoleti non caricherà il file.

+0

Se il postino è aperto con il metodo POST e alcuni x-www-form-urlencoded cambiano forma-dati non inviano multipart/form-data finché non chiudi la scheda e ne apri una nuova +1 – kolexinfos

+2

Questa risposta è così preziosa. Grazie. Problema aperto FYI https://github.com/postmanlabs/postman-app-support/issues/2602 –

+0

GRAZIE così tanto per questo! Mi stavo strappando i capelli chiedendomi perché non funzionava! – user2924127

0

ho messo la mia (ce ne sono molti immagino e sicuramente migliore) soluzione per aiutare molte persone come me, perché ho cercato durante tutta la giornata 1 ;-(


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

file 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

Sì, il tuo enctype è sbagliato e questo è l'unico problema. Assicurati di correggere il tuo enctype altrimenti potresti diventare indefinito in req.file o req.files.