我试图得到一个简单的文件上传机制与Express 4.0工作,但我一直得到未定义的请求。app.post主体中的文件。以下是相关代码:

var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true })); 
app.use(methodOverride()); 
//...
app.post('/fileupload', function (req, res) {
  console.log(req.files); 
  res.send('ok'); 
}); 

. .以及附带的Pug代码:

form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
    input(type="file", name="file", id="file")
    input(type="submit", value="Upload")

解决方案 感谢下面mscdex的响应,我已经切换到使用busboy而不是bodyParser:

var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy()); 
//...
app.post('/fileupload', function(req, res) {
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename); 
        fstream = fs.createWriteStream(__dirname + '/files/' + filename);
        file.pipe(fstream);
        fstream.on('close', function () {
            res.redirect('back');
        });
    });
});

当前回答

Multer是一个处理“多部分/表单数据”的中间件,神奇地使上传的文件和表单数据以请求的形式提供给我们。文件和request.body。

安装multer:—NPM install multer—save

在.html文件中:-

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

.js文件:-

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

希望这能有所帮助!

其他回答

body解析器模块只处理JSON和urlencoded表单提交,而不处理multipart(如果要上传文件,就会出现这种情况)。

对于multipart,您需要使用connect-busboy或multer或connect-multiparty (multiparty/formidable是最初在express bodyParser中间件中使用的)之类的东西。也FWIW,我正在工作在一个更高的层次上的杂工被称为改革。它带有一个Express中间件,也可以单独使用。

Multer是一个处理“多部分/表单数据”的中间件,神奇地使上传的文件和表单数据以请求的形式提供给我们。文件和request.body。

安装multer:—NPM install multer—save

在.html文件中:-

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

.js文件:-

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

希望这能有所帮助!

看起来在Express 3中,体解析器确实支持上传文件,但在Express 4中,当它不再将Connect作为依赖项时,该支持就被取消了

在查看了mscdex的答案中的一些模块后,我发现express-busboy是一个更好的选择,也是最接近临时替代品的选择。我注意到的唯一不同之处是上传文件的属性。

console.log(req.files)使用body解析器(Express 3)输出一个类似这样的对象:

{ file: 
   { fieldName: 'file',
     originalFilename: '360px-Cute_Monkey_cropped.jpg',
     name: '360px-Cute_Monkey_cropped.jpg'
     path: 'uploads/6323-16v7rc.jpg',
     type: 'image/jpeg',
     headers: 
      { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"',
        'content-type': 'image/jpeg' },
     ws: 
      WriteStream { /* ... */ },
     size: 48614 } }

相比console.log(req.files)使用Express -busboy (Express 4):

{ file: 
   { field: 'file',
     filename: '360px-Cute_Monkey_cropped.jpg',
     file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg',
     mimetype: 'image/jpeg',
     encoding: '7bit',
     truncated: false
     uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }

以下是我在谷歌上找到的:

var fileupload = require("express-fileupload");
app.use(fileupload());

哪个上传机制比较简单

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    res.send("File Uploaded");


});

你可以使用express-fileupload npm包来解码文件

const fileUpload = require('express-fileupload');
app.use(fileUpload({useTempFile: true}))

注意:我使用cloudinary上传图片

在这里输入图像描述