上传时将HTTP post multipart / form-data流传输到zlib?

时间:2019-06-04 07:59:31

标签: http stream

背景

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

问题

  • 在通过HTTP通过zlib(或其他位置)上传文件时,是否可以流式传输文件?还是HTTP协议的限制,即在我可以访问数据之前必须完全上传文件?

  • 我在哪里可以了解到更多信息?

1 个答案:

答案 0 :(得分:1)

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

-是的。这就是multipart/form-data处理文件上传的过程。实际上,根据RFC7578

  

媒体类型multipart / form-data遵循多部分MIME数据

的模型

“还是在访问数据之前必须完全上传文件,这是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请求仍处于挂起状态时,已经打印了上传的字节:

enter image description here

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