使用Express 4.0进行文件上传:req.files未定义。

284

我正在尝试使用Express 4.0实现一个简单的文件上传机制,但在app.post请求体中,req.files一直返回undefined。以下是相关代码:

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

2
这在多个文件中如何运作? - chovy
@chovy,使用多个文件应该可以正常工作。 - mscdex
2
我认为可以这样做:app.post('/fileupload',busboy(), function(req, res) { - Shimon Doodkin
好的解决方案。我想指出,在上传之前,您必须在应用程序的主目录中创建一个“./files/”目录,否则您将会收到一个错误。 - sauce
临时文件如何处理?Busboy是否会自动删除它们?我只是没看到任何临时文件在保存到磁盘之前被删除。 - ed-ta
14个回答

0
你可以使用 express-fileupload npm 包来解码文件,例如:
const fileUpload = require('express-fileupload');
app.use(fileUpload({useTempFile: true}))

注意:我正在使用Cloudinary上传图片。

在此输入图像描述


0

使用Formidable:

const formidable = require('formidable');

app.post('/api/upload', (req, res, next) => {
  const form = formidable({ multiples: true });

  form.parse(req, (err, fields, files) => {
    if (err) {
      next(err);
      return;
    }
    res.json({ fields, files });
  });
});

https://www.npmjs.com/package/formidable


0

const fileUpload = require("express-fileupload");

router.route("/uploads").post(fileUpload(), uploadProductImage);

//在路由中添加fileUpload()中间件对我很有用。


嗨,已经有一个带有这个建议的答案了。当回答一个旧问题时,请确保添加一些有用且最重要的是原创的内容。谢谢! - pierpy

-2

express-fileupload 看起来是目前唯一仍然有效的中间件。

使用相同的示例,multerconnect-multiparty 返回未定义的 req.filereq.files 值,但是 express-fileupload 可以正常工作。

关于 req.file/req.files 的空值问题,有很多问题和讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接