使用multer上传时如何限制文件大小?

Posted

技术标签:

【中文标题】使用multer上传时如何限制文件大小?【英文标题】:How to limit the file size when uploading with 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');... 【参考方案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);
    
  
)

现在可以了。

【讨论】:

以上是关于使用multer上传时如何限制文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs中使用sharp调整图像大小然后使用multer上传

具有清晰上传和调整大小的 Multer-S3

如何限制lighttpd 上传文件的大小

如何使用嵌入式 tomcat 在 Spring Boot 中增加文件大小上传限制

Laravel - 超过 PHP 最大上传大小限制时验证文件大小

修改PHP上传文件的大小限制