Node 中下载文件 chunk 拼接注意事项

Node 中下载文件 chunk 拼接注意事项

版权申明:本文为原创文章,转载请注明原文出处

原文链接:https://pangwu86.com/posts/2702290009/

一个遗留项目中增加下载刷机包功能,但下载下来的文件总是比服务器上大一倍左右,也无法正常使用,问题出在哪里呢?


本地 Proxy

为了方便与线上服务对接测试,本地启动的 server 拦截了所有 http 请求然后转发到指定的服务器。

对于 response 的处理, 将分块发送的数据进行了拼接,最后统一处理。

1
2
3
4
5
6
7
8
9
var handler = function (response) {
var reply = "";
response.on("data", function (chunk) {
reply += chunk;
});
response.on("end", function () {
callback(response.statusCode, response.headers, reply);
});
};

因为下载的内容为二进制文件,使用字符串方式的拼接显然是错误的,reply += chunk 的操作等同于 buffer.toString() + buffer.toString(), 把二进制内容当做文本进行拼接,导致了最终内容远大于原始内容。

Chunk 正确拼接

经过调查发现有人遇到了类似的错误,解决方案也很简单,对于二进制文件采用 Buffer 来组合分块内容即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var handler = function (response) {
var chunks = [];
var size = 0;
response.on("data", function (chunk) {
chunks.push(chunk);
size += chunk.length;
});
response.on("end", function () {
var data = null;
switch (chunks.length) {
case 0:
data = new Buffer(0);
break;
case 1:
data = chunks[0];
break;
default:
data = new Buffer(size);
for (var i = 0, pos = 0, l = chunks.length; i < l; i++) {
var chunk = chunks[i];
chunk.copy(data, pos);
pos += chunk.length;
}
break;
}
callback(response.statusCode, response.headers, data);
});
};

Node 中下载文件 chunk 拼接注意事项

https://pangwu86.com/posts/2702290009/

作者

胖五

发布于

2022-05-05

更新于

2023-01-08

许可协议

评论