我们在HTTP中面对大文件的传输时常常有以下的解决方式:
-
数据压缩头字段Accept-Encoding 通过gzip、br等压缩算法来压缩文件大小,主要针对的是文本数据 -
范围请求头字段Accept-Range、Range,常见的响应码为206,可用于视频流之类的下载;
假如我们面对这样一种场景:服务端返回的数据是动态生成的、无法在“Content-Length”给出长度,且不希望在服务器中占用大量内存,就可采用分块传输:
示例代码如下:
const http = require("http");
const server = http.createServer((req, res) => {
res.setHeader("Content-Type", "text/html;charset=utf-8");
res.setHeader("Transfer-Encoding", "chunked");
res.write("<p>hello</>");
setTimeout(() => {
res.write("第一次传输<br />");
}, 1000);
setTimeout(() => {
res.write("第二次传输<br />");
}, 2000);
setTimeout(() => {
res.write("第三次传输<br />");
}, 3000);
setTimeout(() => {
res.write("第四次传输<br />");
}, 4000);
setTimeout(() => {
res.write("第五次传输");
res.end();
}, 5000);
}
});
server.listen(8000, () => {
"server start in port 8000";
});
效果如图:
注意:
- Transfer-Encoding: chunked和Content-Length是不能同时存在,只能其中一个起作用
如果有好的实际使用场景或案例,可在评论区分享😄