如何使用ExpressJS 4上传文件?

11

我在ExpressJS 4 API中发现req.files是无效的。现在如何使用ExpressJS 4上传文件?

2个回答

24

我刚刚升级后遇到了这个问题,req.files未定义。我通过使用multer来解决它。

所以,

npm install multer

然后在你的 app.js 文件中进行以下操作

var multer = require('multer');
app.use(multer({ dest: './tmp/'}));

在那之后,我不需要做任何其他改变,而且我所有原来的功能都可以继续使用。


我按照你的建议使用了multer,它很好用。但是在post路由中上传文件时没有对上传的文件进行控制,我该如何管理两个不同的文件- post url,在其中一个url中我想重命名文件,在另一个url中则不想重命名。我之所以问这个问题是因为“rename”函数只定义了一次,似乎会应用于所有的文件-post实例。 - hussainb
1
不确定您的意思。在我实际处理文件的路由中,我甚至没有引用multermulter仅在我的app.js中使用)。我只是在我的路由中使用req.files[0]、req.files[1]等,并使用fs.readFilefs.writeFile来移动它。从Express 3到Express 4,对我来说没有任何改变...只是在Express 4中添加了multer,所有旧功能都可以正常工作...您可能需要发布一个带有代码示例的问题。 - MikeSmithDev
1
目前我正在使用你的代码和multer,但是出现了“TypeError: multer不是一个函数”的错误。 - Musa Haidari

2

express.bodyParser在express 4中不是默认包含的。您必须单独安装。请参阅https://github.com/expressjs/body-parser

示例:

var bodyParser = require('body-parser');

var app = connect();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

还有node-formidable

var form = new formidable.IncomingForm();

form.parse(req, function(err, fields, files) {
  res.writeHead(200, {'content-type': 'text/plain'});
  res.write('received upload:\n\n');
  res.end(util.inspect({fields: fields, files: files}));
});

return;

以下是我的做法:
form = new formidable.IncomingForm();
form.uploadDir = __dirname.getParent() + "/temp/";
form.parse(req, function(err, fields, files) {
  var newfile, path, uid, versionName;
  uid = uuid.v4();
  newfile = __dirname.getParent() + "/uploads/" + uid;
  copyFile(files.file.path, newfile, function(err) {
    if (err) {
      console.log(err);
      req.flash("error", "Oops, something went wrong! (reason: copy)");
      return res.redirect(req.url);
    }
    fs.unlink(files.file.path, function(err) {
      if (err) {
        req.flash("error", "Oops, something went wrong! (reason: deletion)");
        return res.redirect(req.url);
      }
      // done!
      // ...
    });
  });
});

答案是正确的,使用第三方中间件。但我使用的是connect-multiparty。然后我可以使用req.files来获取文件。 - vcLwei
1
在 Express 4.x 中使用 body parser 已经被弃用,而且有很好的理由(http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html)。 - uiron

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