node.js - 使用 Fetch-node.buffer() 在 Node 中下载二进制文件 - 文件未正确解码
问题描述
重要更新:我发现我在 Apple Mac 上没有这样的问题!仅在 Windows 7 上!
同一个 pdf 文件被下载了两次。我可以打开一个文件,第二个文件 - 我无法打开。也许有人可以给我任何建议或知道解决方案?谢谢!
我使用 fetch-node 库在 Electron.js 中下载二进制文件。当文件很小时没有问题,但是对于大文件,我会定期(不是经常)看到文件解码的问题。我无法打开这样的文件!我还发现一些文件有 5KB 大小,但应该有 10Mb+ 大小!
function fastFetch(url, dest, fileName, callback) {
console.log("fastFetch-------------------------------------------------------");
//import fetch from 'node-fetch';
fetch(url)
.then(res => res.buffer())
.then(buffer => {
const settings = {
flags: 'w',
encoding: null, //not applicable / no changes
mode: 0o666
};
try {
fs.writeFileSync(dest, buffer, settings);
let msgOK = {
filename: fileName,
status: 'OK',
text: `File downloaded successfully`
}
if (callback) callback(msgOK);
console.log(msgOK.text);
isLoading = false; //IMPORTANT!
} catch (err) {
console.error(err.stack || err.message);
let msgErr = {
filename: fileName,
status: 'ERROR',
text: `Error in file downloading ${err.message}`
}
ERRORS.push(err);
if (callback) callback(msgErr);
}
})
}
带有 WriteStream 的版本 - 相同的问题 - 一个文件可以打开,另一个文件由于编码问题而无法打开:
function fetchWithFIleStream(url, dest, fileName, callback) {
console.log("fetch With FIle Stream-------------------------------------------------------");
//import fetch from 'node-fetch';
fetch(url)
.then(res => {
console.log("--------------------------------------------")
//console.log(res);
console.log(res.ok);
console.log(res.status);
console.log(res.statusText);
console.log(res.headers.raw());
console.log(res.headers.get('content-type'));
console.log("--------------------------------------------")
//ERROR: Not a function: res.setEncoding('binary');
return res.buffer();
})
.then(buffer => {
const settings = {
flags: 'w',
encoding: null, //default: 'utf8',
fd: null,
mode: 0o666,
autoClose: true
};
// response.pipe(fs.createWriteStream(dest, settings));
var wstream = fs.createWriteStream(dest, settings);
wstream.write(buffer);
wstream.on('finish', function () {
//console.log('END------------------------------------------------------')
let msgOK = {
filename: fileName,
status: 'OK',
text: `File downloaded successfully`
}
if (callback) callback(msgOK);
console.log(msgOK.text);
isLoading = false; //IMPORTANT!
wstream.end();
});
wstream.end();
})
}
解决方案
推荐阅读
- r - 我在对数据集设置子集时遇到问题
- javascript - 背景图像 url() 不起作用,但带有 src 的图像标签可以
- javascript - js中的问号是什么意思?
- javascript - 我正在尝试用 javascript 读取文件,我该如何解决这个问题?
- ruby - Ruby MongoId:回调中的竞争条件
- php - 带有准备好的语句的快速密码更新问题
- uwp - 如何更改 GridViewItem UWP 的样式?
- excel - Excel中有没有办法重置累计总数?
- r - 根据 r 中的数字命名列表中的元素对值求和
- reactjs - React useEffect 清理多个功能