首页 > 解决方案 > 将块写入可写流会产生不正确的文件 - 损坏且比原始文件大

问题描述

我想从服务器下载一个文件,我们有一个 C# 服务,它返回输入中请求的文件数据块(HTTP 状态 - 206)。在客户端,在 Node.js 应用程序中,我想组合所有块并保存文件。

我可以成功下载一个文本文件,它与服务器上的文件匹配。但是,当我尝试下载 PDF 文件时。结果文件的大小几乎是原始文件的两倍,并且已损坏-我下载了单个块-使用可写流将它们组合在一起。

我试图创建可写流,将编码指定为 utf8(导致文件更大)、二进制和 ASCII(导致文件更小)。

我无法创建可读流并将其通过管道传输到可写流,因为源数据(块)已经以 API 响应的形式存在,并且可读流只接受文件路径作为输入。这是对的吗?

我已经浏览了以下帖子,但这并没有太大帮助。

private async WriteToStreamAsyc(wStream: Writable, chunk: any) {
    !await wStream.write(chunk);
}

我知道这是一个非常微不足道的案例,人们可能会广泛地执行此任务,但是,我没有运气和选择,任何建议都可能非常有帮助。

标签: node.jstypescriptstream

解决方案


我正在使用节点请求库。请求库的默认编码为 utf8,因此它将响应缓冲区转换为字符串,这会导致文件变大,并且无法识别特殊字符,从而导致文件损坏。通过将编码指定为 null,我们可以获得原始缓冲区。

encoding - 用于响应数据的 setEncoding 的编码。如果为 null,则正文作为缓冲区返回。其他任何内容(包括 undefined 的默认值)都将作为编码参数传递给 toString() (这意味着默认情况下这实际上是 utf8)。(注意:如果您需要二进制数据,则应设置 encoding: null。)


推荐阅读