【问题标题】:Can we limit upload file size without uploading it fully?我们可以在不完全上传的情况下限制上传文件的大小吗?
【发布时间】:2018-02-18 19:44:50
【问题描述】:

我正在使用 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 错误。

  • 但在这两种情况下,首先要检查整个文件上传,然后检查文件大小。

上传一个 1GB 的文件然后检查它的大小是不是 1MB 一点都不好。 所以我想知道当文件大小限制超过时是否有任何方法可以在中间停止上传。我不想依赖 Content-Length。

【问题讨论】:

  • 尝试将fileSize更改为1再试一次,告诉我
  • @turmuka 一样。我测试了一个 33MB 的文件,在 13581.00 毫秒后显示错误:文件太大
  • 尝试使最大文件大小250000 我计算错误,如下面的答案所述,当它达到文件大小时应该退出接收流

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


【解决方案1】:

您可以使用 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">

【讨论】:

    【解决方案2】:

    通过查看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?

    【讨论】:

    • 是的,1GB 文件不会被保存,但缓冲区会占用内存。是的,我正在尝试关闭套接字
    • 在我的测试上传期间内存消耗没有明显变化(我使用两台单独的物理机进行测试,而不是localhost)。经过一番挖掘,似乎busboy 立即发出其limit 事件,multer 中的处理程序在文件完成上传之前不会触发错误,因此挂钩代码以关闭连接很困难。应该可以直接使用busboy。通过像 nginx 这样的网络服务器可能会提供一种更好的方法来防止恶意用户,但如果有人想向你发出狡猾的请求,就很难阻止他们。
    • 所以您建议使用 nginx 或 apache 作为代理?如果上传大小超过限制,他们不会上传整个文件吗?
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多