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

How to validate size of file uploads in Express with Multer?

本文关键字:文件大小 Express 何使用 Multer 验证      更新时间:2023-09-26

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

我知道您可以在实例化Multer时在options对象中设置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或其他表单解析中间件处理文件上传验证的最佳方法是什么?

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

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

编辑:似乎虽然从busboy的truncated属性的多个副本,它正在使用一个旧版本的busboy,还没有truncated属性。关于更新依赖项存在一个问题。另一种方法是在超过最大大小时将自己的属性附加到传递给onFileUploadDatafile对象上。这个属性应该在req.files.foo对象上可用。

编辑2:它没有相同的"API"作为multer或连接多方(req.filesreq.body),但我正在努力改革,允许您定义验证规则和错误消息。和multer一样,它使用了busboy under the hood