6

我应该实现一个我想使用 bodyparser 的上传表单,但我阅读了 http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html

那么使用平均堆栈快速上传文件的方法是什么?可能是强大的还是其他模块?

4

2 回答 2

6

该警告专门针对将 express.bodyparser 中间件添加到整个堆栈,因为它将 express.multipart 添加到所有 POST 端点,因此所有 POST 端点都会自动接受文件上传。默认情况下,框架会自动将所有上传的文件保存到/tmp其中,因此除非您正在清理它们,否则攻击者可能会用上传的文件淹没您的磁盘。

如果你想避免使用额外的模块,你应该做的是在你想要允许文件上传的端点上实现 express.multipart。这就是我所说的:

var express = require("express")
  , app = express();

// middleware (no bodyparser here)
app.use(express.json());
app.use(express.urlencoded());

// average GET endpoint
app.get("/", function(req,res) {
  res.send('ok');
});

// average POST endpont
app.post("/login", function(req,res) {
  res.send('ok');
});

// File upload POST endpoint
app.post('/upload', express.multipart, function(req, res) {
  //File upload logic here
  //Make sure to delete or move the file accordingly here, otherwise files will pile up in `/tmp`
});

请注意文件上传端点中包含 express.multipart。此端点现在将处理分段文件上传,假设您正确处理它们,它们不会构成威胁。

现在,在告诉了你所有这些之后,由于这个确切的问题,Connect 正在弃用 multipart,但似乎没有任何计划添加基于流的文件上传替换。相反,他们建议您使用node-multiparty,它使用流来避免将文件放在磁盘上。但是,我似乎找不到任何好的参考资料来使用多方作为中间件而不保存文件,因此您必须联系多方的作者或仔细查看使用 Express 实现它的 API .

于 2014-02-10T07:33:07.783 回答
2

我创建了一个使用 Express & Multer 的示例 - 非常简单,避免了所有 Connect 警告

https://github.com/jonjenkins/express-upload

于 2014-03-30T17:14:35.790 回答