【问题标题】:How to limit the file size when uploading with multer?使用multer上传时如何限制文件大小?
【发布时间】:2016-04-14 08:14:28
【问题描述】:

我正在用 multer 制作一个简单的文件上传系统:

var maxSize = 1 * 1000 * 1000;

var storage = multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, 'public/upload');
  },
  filename: function (req, file, callback) {
    callback(null, file.originalname);
  },
  onFileUploadStart: function(file, req, res){
    if(req.files.file.length > maxSize) {
      return false;
    }
  }

});

var upload = multer({ storage : storage}).single('bestand');

router.post('/upload',function(req,res){
    upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
        console.log(req.file);
        res.redirect(req.baseUrl);
    });
});

这一切正常,文件被上传。唯一不起作用的是最大尺寸的限制。我这样做是为了让 onfileupload start 检查文件的大小,如果它太大,它将返回 false。但是文件仍然刚刚上传。

似乎onFileUploadStart 根本没有做任何事情。我试着console.log 里面的东西,但什么都没有。

我做错了什么?使用 multer 上传时如何限制文件大小?

【问题讨论】:

  • 你在哪里看到需要在偶数onFileUploadStart的处理程序中返回false if req.files.file.length > maxSize
  • 我正在关注的教程。但我假设你说这不是停止上传的正确方法?
  • 你能console.log(在 if 语句之前)在同一个处理程序中的文件吗?你看到了什么?
  • 显然也许你应该使用fileFilter而不是处理偶数onFileUploadStart(显然文件大小尚不清楚或为0......)顺便说一句......检查这里关于您应该如何限制文件大小:github.com/expressjs/multer/issues/186 如果您解决了问题,我鼓励您回答自己的问题;)
  • 这里还有另一个限制文件大小的示例(除其他外):github.com/expressjs/multer/issues/120:您基本上需要将文件大小指定为您作为属性传递的limits 对象您传递给multer 的对象,即类似var upload = multer({ storage : storage, limits: {fileSize: maxSize } }).single('bestand');...

标签: node.js express multer


【解决方案1】:

新的multer API 没有onFileUploadStart。如果你想限制文件大小,你应该将limits: { fileSize: maxSize }添加到传递给multer()的对象中:

var upload = multer({
  storage: storage,
  limits: { fileSize: maxSize }
}).single('bestand');

【讨论】:

  • 您应该能够添加 Express 错误处理程序并检查 err.code === 'LIMIT_FILE_SIZE'
  • @mscdex 我也使用了 fileSize。但我认为超过限制时它不会停止上传。而是上传整个文件然后检查限制。我错过了什么吗?
  • @JayadrathaMondal 如果你能证明这一点,那么我会说向 github 上的 multer issue tracker 提交问题。
  • @mscdex 是的,这是一个问题,尝试上传一个您可以理解的 1GB 文件。我与 LinusU(Multer 维护者)进行了交谈。并列出了问题,github.com/expressjs/multer/issues/344。尝试 multer v2.0 alpha。他说它可能会在 v2 中修复
  • @JayadrathaMondal 问题仍未解决。这个问题有更新吗?最后一次回复是在 3 月,到目前为止,我还没有看到他们正在积极尝试解决此问题的任何内容。
【解决方案2】:

我想是你在找。 祝您有美好的一天。

const fileFilter = (req, file, cb) => {

const fileSize = parseInt(req.headers['content-length']);

if((file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/jpeg' || file.mimetype === 'application/octet-stream') && (fileSize <= 1282810)) {

cb(null, true);

} else if(file.mimetype === 'video/mp4' && fileSize <= 22282810) {

cb(null, true);

}

else {

cb(null, false);

}

};

【讨论】:

    【解决方案3】:

    对于将 Multer 与 Ts.ED 一起使用的任何人。当我尝试上传一个太大的文件时(不管它有什么扩展名),我最终出现了以下错误:

    无法读取未定义的属性(读取“替换”)

    我确实使用了以下代码来解决这个问题:

    @Configuration({
      ...
      multer: {
        limits: {
          fieldNameSize: 300,
          fileSize: 1048576, // 10 Mb
        },
        fileFilter: (req, file, callback) => {
          const acceptableExtensions = ['.png', '.jpg'];
          if (!(acceptableExtensions.includes(Path.extname(file.originalname)))) {
            return callback(new Error('...'));
          }
    
          // added this
          const fileSize = parseInt(req.headers['content-length']);
          if (fileSize > 1048576) {
            return callback(new Error('...'));
          }
          // --
    
    
          callback(null, true);
        }
      }
    })
    

    现在可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2011-12-26
      • 2012-04-26
      • 1970-01-01
      • 2014-07-14
      • 2011-01-29
      • 2017-03-09
      相关资源
      最近更新 更多