通过压缩流式传输 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、zlib(或其他地方)上传文件时,是否可以流式传输文件?还是HTTP协议的限制,文件必须完全上传才能访问数据?
我在哪里可以阅读更多相关信息?
“是否可以在通过 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”节流来模拟慢速网络。)
背景
我想减少获取文件、压缩文件并将其存储在某处的服务的内存和临时存储占用空间。假设内存限制为 4 GB,磁盘存储限制为 512 MB,处理的文件可以为 10 GB。
问题
在通过 HTTP、zlib(或其他地方)上传文件时,是否可以流式传输文件?还是HTTP协议的限制,文件必须完全上传才能访问数据?
我在哪里可以阅读更多相关信息?
“是否可以在通过 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”节流来模拟慢速网络。)