我使用multer v1.3.0和express v4.15.4。
我使用了像下面的文件大小限制
multer({
storage: storage,
limits: {fileSize: 1*1000*50, files:1},
fileFilter: function (req, file, cb) {
if (_.indexOf(['image/jpeg', 'image/png'], file.mimetype) == -1)
cb(null, false);
else
cb(null, true)
}
});
在这种情况下,我认为限制无效。因为没有得到任何 LIMIT_FILE_SIZE错误。
如果我删除了fileFilter,那么我的LIMIT_FILE_SIZE错误。
但在这两种情况下,首先整个文件上传&然后检查fileSize。
上传一个1GB的文件然后检查它的1MB是不是很好。 所以我想知道当文件大小限制超过时,是否有任何方法可以在中间停止上传。我不想依赖Content-Length。
答案 0 :(得分:0)
通过查看multer
和busboy
来源,看起来它会将数据大小计算为运行总计,并在达到fileSize
后立即停止阅读流。请参阅此处的代码:
因此,虽然可以上传1GB,但不应保存在任何地方。
如果你想停止继续上传,我认为你必须关闭套接字,虽然我自己没有尝试过。在请求仍在尝试上传数据时,我不知道有任何干净的回应方式。
相关:
答案 1 :(得分:0)
您可以使用 javascript 脚本来防止用户上传所有 1GB 并出现文件大小超出错误。但是,所有客户端检查都可以绕过,因此您仍应在后端强制执行文件限制。
您的代码是正确的,应该可以正常工作。我猜你担心文件被上传。由于 Multer 在上传后检查大小,因此没有解决方法。
这是您可以放入的 javascript,以防止有人上传您的客户端代码。
function ValidateSize(file) {
const FileSize = file.files[0].size / 1024 / 1024;
if (FileSize > 20) {
alert('File size exceeds 20 MB');
document.getElementById('formFile').value = null;
}
}
<label for="formFile" class="form-label">Select file to upload (Max File Size: 20MB):</label>
<input class="form-control" type="file" onchange="ValidateSize(this)" id="formFile" name="file">