通过压缩流式传输 HTTP post multipart/form-data 并在上传时存入存储?

Stream a HTTP post multipart/form-data through compression and into storage while uploading?

背景

我想减少获取文件、压缩文件并将其存储在某处的服务的内存和临时存储占用空间。假设内存限制为 4 GB,磁盘存储限制为 512 MB,处理的文件可以为 10 GB。

问题

“是否可以在通过 HTTP 上传时流式传输文件?”

-- 是的。这就是 multipart/form-data 对文件上传所做的。实际上,根据 RFC7578:

The media type multipart/form-data follows the model of multipart MIME data streams

"还是HTTP协议的限制,文件必须完全上传才能访问数据?"

-- 不需要。只要上传了一些字节就可以访问数据,不需要等待上传完成。不过我对zlib不熟悉,不确定zlib是否可以使用部分文件字节。

您可以做一个小实验来演示这种“上传时访问数据”的行为。这是一个简单的 Node.js Web 应用程序片段,但您可以使用任何服务器端技术来实现此示例:

const Busboy = require('busboy');
router.post('/upload', function (req, res) {
  let busboy = new Busboy({headers: req.headers});
  busboy.on('file', function (fieldName, fileStream, fileName) {
    fileStream.on('data', function(data) {
      console.log(data);
    });
  })
})

上传一个大文件并发送POST /upload请求后,您可以观察到:当浏览器的网络调试面板中HTTP请求仍在挂起时,已经打印了上传的字节:

(请注意我正在使用“快速 3G”节流来模拟慢速网络。)