8

我正在multer用作 express4 的多部分中间件。

Express 配置为使用护照作为身份验证中间件,但如果用户未通过身份验证,我找不到阻止文件上传的方法。

我想使用 onFileUploadStart 来拒绝文件,但我找不到带有"request" object的链接,可以用它来匹配用户。

下面的代码用于配置 express vs multer:

...
// Multipart file upload
app.use(multer(
{
  dest: wwwroot + path.sep + 'uploaded' + path.sep, 
  onFileUploadStart: function (file) {
    //TODO : apply security check : user auth, file size, number...
    console.log(file.fieldname + ' is starting ...')
},
onFileUploadComplete: function (file) {
    console.log(file.fieldname + ' uploaded to  ' + file.path)
}
}));
...
app.use(passport.auth.initialize());
app.use(passport.auth.session());   
4

3 回答 3

7

编辑

app.use(passport) 如果有帮助,我将在下面留下答案,但答案实际上很简单:您需要将两个调用移至对app.use(multer). 快速链中的每个步骤都按顺序处理,因此如果您希望拒绝错误的身份验证尝试,请在处理传入文件上传之前执行此操作。


可能有更好的方法来做到这一点,但这应该让你开始。更改您的快速配置以使用闭包,您将拥有对该req变量的完全访问权限。

app.use(function(req, res, next) {
  var handler = multer({
    dest: wwwroot + path.sep + 'uploaded' + path.sep, 
    onFileUploadStart: function (file) {
      // You now have access to req
      console.dir(req);
      console.log(file.fieldname + ' is starting ...')
    },
    onFileUploadComplete: function (file) {
      console.log(file.fieldname + ' uploaded to  ' + file.path)
    }
  });
  handler(req, res, next);
});
于 2014-09-18T06:15:50.233 回答
4

好的,我想我为您找到了解决方案。它不是我自己问题的完整解决方案,但它适用于您的特定情况,即在下载文件之前检查用户是否通过 Passport 获得授权。

诀窍是在您的后期处理程序中使用中间件一次做一件事。将调用第一个护照以将用户对象放入 req 对象中。然后,您检查用户是否已通过身份验证。如果是这种情况,您下载文件然后使用它。这是一个示例:

//don't add multer as a middleware to all requests. 
//If you do this, people will be able to upload files
//in ALL YOUR 'post' handlers!!! 
var Multer = require('multer');

//this is a middleware to check if user is authenticated
function check(req, res, next){
    if(req.isAuthenticated()){
        console.log(req.user);
        next();
    }
    else{
        res.send(401);
    }
}

//this is a middleware to be called after file is downloaded
function finish(req, res, next){
    var filePath = req.files.file.path;
    res.send("Hello " + req.user.name + "! Your file was uploaded to " + filePath);
}

//this is the route handler. First check auth. If so, 
//proceed to multer middleware to download file
//lastly, use the file as you need
app.post('/test', [check, Multer(), finish]);

这只是因为 Passport 不使用正文数据来验证用户身份:它使用不在正文中的会话。因此,您可以使用 Passport 并获取用户数据,但不能确保在开始下载文件之前解析所有非文件字段(因为它们在 express req 流中汇集在一起​​)

于 2014-10-17T08:04:27.477 回答
0

从 multer api 文档“您甚至可以停止上传文件 - 只需从事件处理程序返回 false。该文件不会被处理或到达文件系统。”

于 2014-08-25T13:54:26.720 回答