node.js - 将块写入可写流会产生不正确的文件 - 损坏且比原始文件大
问题描述
我想从服务器下载一个文件,我们有一个 C# 服务,它返回输入中请求的文件数据块(HTTP 状态 - 206)。在客户端,在 Node.js 应用程序中,我想组合所有块并保存文件。
我可以成功下载一个文本文件,它与服务器上的文件匹配。但是,当我尝试下载 PDF 文件时。结果文件的大小几乎是原始文件的两倍,并且已损坏-我下载了单个块-使用可写流将它们组合在一起。
我试图创建可写流,将编码指定为 utf8(导致文件更大)、二进制和 ASCII(导致文件更小)。
我无法创建可读流并将其通过管道传输到可写流,因为源数据(块)已经以 API 响应的形式存在,并且可读流只接受文件路径作为输入。这是对的吗?
我已经浏览了以下帖子,但这并没有太大帮助。
private async WriteToStreamAsyc(wStream: Writable, chunk: any) {
!await wStream.write(chunk);
}
我知道这是一个非常微不足道的案例,人们可能会广泛地执行此任务,但是,我没有运气和选择,任何建议都可能非常有帮助。
解决方案
我正在使用节点请求库。请求库的默认编码为 utf8,因此它将响应缓冲区转换为字符串,这会导致文件变大,并且无法识别特殊字符,从而导致文件损坏。通过将编码指定为 null,我们可以获得原始缓冲区。
encoding - 用于响应数据的 setEncoding 的编码。如果为 null,则正文作为缓冲区返回。其他任何内容(包括 undefined 的默认值)都将作为编码参数传递给 toString() (这意味着默认情况下这实际上是 utf8)。(注意:如果您需要二进制数据,则应设置 encoding: null。)
推荐阅读
- android - Flutter / FireStore: how to display an image from Firestore in Flutter?
- java - 在 Java 中优化多个 if-else 条件
- javascript - 如何在javascript上将1000000转换为1M和1000转换为1K
- laravel - 调用 Eloquent 集合函数
- angular - 在生产版本中获得'未捕获(承诺):错误:StaticInjectorError(a)[t]:'....
- red - Red Reactive : cannot get true value for face data
- database - 如何在 Intershop7.9 中为自定义对象创建数据库表
- angularjs - Kendo Scheduler 加载时间和响应能力随着数据量的增加而减少
- c# - WPF binding SelectedItemBinding of a DataGridComboBoxColumn
- java - Java将网络掩码转换为掩码长度