如何使用 Multer 验证 Express 中上传的文件大小?

dsc*_*ger 4 javascript file-upload node.js coffeescript express

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

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

app.use multer
  limits:
    fileSize: 1024 * 1024
Run Code Online (Sandbox Code Playgroud)

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

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

最终,我的想法是,当 Multer 解析请求并且上传的文件太大时,我想向用户显示一条闪存消息并重定向到表单,以便她可以尝试较小的文件。我的控制器的动作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' 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

要验证文件上传的大小,您只需使用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 

}
Run Code Online (Sandbox Code Playgroud)