【问题标题】:How to validate size of file uploads in Express with Multer?如何使用 Multer 在 Express 中验证文件上传的大小?
【发布时间】:2014-07-14 07:50:35
【问题描述】:

我在Express 中使用Multer 作为multipart/form-data 中间件。我想知道如何验证上传文件的大小,最好是在上传文件时验证。

我知道您可以在实例化 Multer 时在选项对象中设置 limits,如下所示:

app.use multer
  limits:
    fileSize: 1024 * 1024

但是,这只会截断上传的文件,并且不允许显示“文件太大”之类的错误消息。当文件大小超过限制时。

我还检查了事件处理程序onFileUploadData(file, data),您可以在其中访问file 对象和data 缓冲区。在这里,我可以通过检查data.length 来检查当前文件大小。不过,我不清楚如何处理data.length 大于我想要允许的最大上传文件大小的情况。

最终,我的想法是,当 Multer 解析请求并且上传的文件太大时,我想向用户显示一条 Flash 消息并重定向到表单,以便她可以尝试使用较小的文件。我的控制器的create 操作看起来像这样:

exports.create = (req, res) ->
  Record.create(req.body)
  .success (record) ->
    image = req.files.image
    uploadImage(image, record.id).then ->
      req.flash 'success', 'Record created.'
      res.redirect "/records/#{record.id}"
  .error (err) ->
    req.flash 'error', err
    res.redirect 'records/new' 

问题是req.files.image已经是解析后的图像,此时已上传到系统tmp文件夹。因此,即使在此处检查文件大小,我也无法真正防止不必要的大文件上传。

在 Express 中使用 Multer 或其他表单解析中间件处理文件上传验证的最佳方法是什么?

【问题讨论】:

    标签: javascript node.js file-upload express coffeescript


    【解决方案1】:

    要验证文件上传的大小,您只需使用req.file.buffer

    以下代码只是一个示例。

    // Set your file size limit
    
    const maxSize = 1 * 1024 * 1024; // for 1MB 
    
    // validate file size
    
    if (req.file.buffer.byteLength >= maxSize) {
    
    // write code here
    
    } else {
    
    // write code here 
    
    }
    

    【讨论】:

      【解决方案2】:

      如果您为onFileUploadComplete 添加处理程序,则会传入file 对象,该对象具有truncated 属性。如果此属性设置为true,则表示特定文件超出了定义的最大文件大小限制。

      编辑:似乎虽然 multer 复制了 busboy 的 truncated 属性,但它使用的旧版本的 busboy 还没有 truncated 属性。有一个关于更新依赖的现有issue。另一种方法是在超过最大大小时将您自己的属性附加到传递给onFileUploadDatafile 对象上。然后,该属性应该在 req.files.foo 对象上可用。

      编辑 2:它没有与 multer 或 connect-multiparty(req.filesreq.body)相同的“API”,但我正在研究 reformed,它允许您定义验证规则和错误消息.像 multer 一样,它在引擎盖下使用了 busboy。

      【讨论】:

      • 是的,就像我在问题中提到的那样,我知道即使在 onFileUploadData 处理程序中我也可以按照您的建议进行操作。在那里我可以检查数据缓冲区,当data.length < maxUploadSize 我知道文件大小超过最大文件大小限制时。这仍然无助于我处理这种情况。由于此处理程序是在 multer 初始化时在选项对象中设置的,因此我不知道 reqres 对象,并且看不到任何可行的方法来处理文件太大的事实这个阶段。
      • 您可以在onFileUploadData 函数中将属性(例如toobig)附加到file 对象,然后在您的路由处理程序中可见(例如req.files.image.toobig)。跨度>
      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2018-07-21
      • 2016-10-22
      • 2016-10-07
      • 1970-01-01
      • 2016-04-14
      • 2020-05-21
      相关资源
      最近更新 更多