node.js - 节点 fs:写入两倍于缓冲区长度的二进制文件
问题描述
我调用 REST API 并希望将结果写入文件。它在 python 中工作,但在节点中我得到一个比我(正确)在 python 中得到的更大的错误文件。
Python 工作示例:
r =requests.get("""https://...""", headers=headers)
f = open("pyData.gz", "wb")
f.write(r.content)
f.close()
起初它在 Python 中不起作用,直到我意识到我必须编写r.content
而不是r.text
因为.text
是 UTF 编码(?)。我还必须将文件系统标志从 更改w
为wb
。但后来一切都很好。
现在我认为在 js 中可能是相同的:
const responseData = await got.get(`https://...`, {
headers: {
...
},
responseType: 'buffer',
throwHttpErrors: false
}).catch((err) => {
console.log('Err ', err);
});
console.log(`response length ${responseData.body.length}`) //10721
const zippedData = responseData.body;
console.log(zippedData.length) //10721
fs.open('./jsData.gz', 'w', function(err, fd) {
if (err) {
throw 'error opening file: ' + err;
}
fs.write(fd, zippedData, 0, zippedData.length, function(err, result) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function() {
console.log('file written'); //becomes 21KB in size
})
});
});
我之前在 Python 中遇到的问题也出现了类似的问题:文件已损坏,并且几乎是应有大小的两倍。由于我已经设置responseType
并且buffer
.length 是正确的,我认为我在编写文件时一定做错了什么。我在https://nodejs.org/api/fs.html#fs_file_system_flags中找不到任何wb
等价物- 我还能尝试什么?
解决方案
我尝试了两种方式的base64打印,但这也不起作用,因为python和node似乎对如何表示数据有不同的理解(那么base64有什么意义呢??)
从 切换got
到后,request
我注意到相同的结果并检查返回的响应大小,我注意到 python 收到的内容与收到的节点/请求收到的内容之间存在小的差异。现在我有了更多关于要搜索什么的信息以及在所有赞成的回复中,这个有 0 票的回答为我解决了这个问题:https ://stackoverflow.com/a/59014774/2161301
encoding: null
作为选项添加会带来正确的大小,并让我以预期的方式保存文件。
我之前发现了一个相关的 github 问题,如果它也适用的话,请 idk https://github.com/request/request-promise/issues/171
推荐阅读
- kubernetes - 如何在 Kubernetes 中创建秘密文件
- angular - Angular 和 Bootstrapstudio bootstrap/css/bootstrap.min.css) 返回了一个 Promise
- mysql - 如果条件显示语法错误,则在内部声明 - MYSQL 触发器
- python - 使用 np python3 拆分数组除以 16
- c# - 将 DocuSign 与 Unit4 集成
- angular - 角度输入未传递布尔值,因为它始终为真
- css - 如何将提交按钮移动到表单下方
- ios - iOS TTS Alex 语音在实际不可用时被视为可用
- python - 尝试使用 pandas 读取 csv 文件时出错
- python - Pandas 中一列中从一个值到另一个值的转换计数