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

时间:2014-05-25 11:39:57

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

我在Multer中使用Express作为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文件夹。因此,即使检查文件大小,也不会真正允许我防止不必要的大文件上传。

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

3 个答案:

答案 0 :(得分:2)

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

编辑:虽然multer从busboy复制truncated属性,但它使用的是尚未拥有truncated属性的旧版busboy。关于更新依赖关系的现有issue已经存在。另一种方法是在超出最大大小时将自己的属性添加到传递给file的{​​{1}}对象。然后,此属性应在onFileUploadData对象上可用。

编辑2:它没有相同的" API"作为multer或connect-multiparty(req.files.fooreq.files),但我正在研究reformed,它允许您定义验证规则和错误消息。像咕噜咕噜一样,它使用敞篷车。

答案 1 :(得分:0)

响应为时已晚,但:

const upload = multer({storage, limits: {fileSize: '1mb'},

当然您可以将1mb更改为您想要的任何数字

答案 2 :(得分:0)

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

}
相关问题