首页 > 解决方案 > 节点 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 编码(?)。我还必须将文件系统标志从 更改wwb。但后来一切都很好。

现在我认为在 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等价物- 我还能尝试什么?

标签: node.jsfs

解决方案


我尝试了两种方式的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


推荐阅读