我在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中处理文件上传验证的最佳方法是什么?
答案 0 :(得分:2)
如果为onFileUploadComplete
添加处理程序,则传递file
对象,该对象具有truncated
属性。如果此属性设置为true
,则表示特定文件超出了定义的最大文件大小限制。
编辑:虽然multer从busboy复制truncated
属性,但它使用的是尚未拥有truncated
属性的旧版busboy。关于更新依赖关系的现有issue已经存在。另一种方法是在超出最大大小时将自己的属性添加到传递给file
的{{1}}对象。然后,此属性应在onFileUploadData
对象上可用。
编辑2:它没有相同的" API"作为multer或connect-multiparty(req.files.foo
和req.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
}