我们可以限制上传文件大小而不完全上传吗?

时间:2017-09-10 12:55:21

标签: node.js express file-upload filesize multer

我使用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。

2 个答案:

答案 0 :(得分:0)

通过查看multerbusboy来源,看起来它会将数据大小计算为运行总计,并在达到fileSize后立即停止阅读流。请参阅此处的代码:

https://github.com/mscdex/busboy/blob/8f6752507491c0c9b01198fca626a9fe6f578092/lib/types/multipart.js#L216

因此,虽然可以上传1GB,但不应保存在任何地方。

如果你想停止继续上传,我认为你必须关闭套接字,虽然我自己没有尝试过。在请求仍在尝试上传数据时,我不知道有任何干净的回应方式。

相关:

YES or NO: Can a server send an HTTP response, while still uploading the file from the correlative HTTP request?

答案 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">