2016-03-07 2 views
11

Я рассмотрел много ответов для этого же вопроса, но пока не нашел рабочего решения. Я пытаюсь сделать веб-приложение, чтобы вы могли загружать файлы с помощью express и multer, и у меня возникла проблема, когда файлы не загружаются, а req.file всегда не определен.multer - req.file всегда undefined

Мой код ниже

'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 + '...'); 
}); 

Форма

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

Помощь очень высоко, это сводит меня с ума.

ответ

10

Ваш enctype является немного неправильным, он должен быть multipart/form-data вместо multipart/formdata.

+0

Большое вам спасибо! – mlamp

20

В случае почтальона, попробуйте следующее:

  1. Закрыть вкладку Почтальон для API
  2. Откройте вкладку новой снова
  3. Rebuild запроса API, а затем отправить.

Это может решить проблему. Каждый раз, когда вы перезапускаете сервер, вам нужно сделать выше шагов для повторного вызова API. Причина, по которой multer отправляет обратно куки, называемые connect.sid, клиенту, которые могут потребоваться при дальнейшей связи. Использование старых файлов cookie не будет загружать файл.

+0

Если у вас есть почтальон, открытый с помощью метода POST, а некоторые измененные формы формы x-www-form-urlencoded не отправляют данные multipart/form, пока вы не закрываете вкладку и не открываете новую +1 – kolexinfos

+2

Этот ответ так ценен. Спасибо. Открытый выпуск FYI https://github.com/postmanlabs/postman-app-support/issues/2602 –

+0

СПАСИБО для этого! Я рвал свои волосы, удивляясь, почему это не работает! – user2924127

0

я кладу (Есть много я представить себе и, конечно, лучше) решение, чтобы помочь многим людям, как я, потому что я искал в течение 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

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

Да, ваш enctype является неправильным, и это единственная проблема. Убедитесь, что вы исправили свой enctype, иначе вы, скорее всего, получите undefined в req.file или req.files.