我正在创建一个Electron应用程序,我想将图像流式化为文件(所以基本上下载它)。
我想使用本机Fetch API,因为请求模块将是一个很大的开销。
但是响应没有管道方法,所以我不能做像
这样的事情fetch('https://imageurl.jpg')
.then(response => response.pipe(fs.createWriteStream('image.jpg')));
那么如何合并fetch
和fs.createWriteStream
?
答案 0 :(得分:5)
我得到了它的工作。我创建了一个将响应转换为可读流的函数。
const responseToReadable = response => {
const reader = response.body.getReader();
const rs = new Readable();
rs._read = async () => {
const result = await reader.read();
if(!result.done){
rs.push(Buffer.from(result.value));
}else{
rs.push(null);
return;
}
};
return rs;
};
所以有了它,我可以做到
fetch('https://imageurl.jpg')
.then(response => responseToReadable(response).pipe(fs.createWriteStream('image.jpg')));
答案 1 :(得分:2)
Fetch并不能真正使用nodejs Streams开箱即用,因为浏览器中的Stream API与一个nodejs提供的不同,即你无法将浏览器流传输到nodejs流中,反之亦然。
electron-fetch模块似乎为您解决了这个问题。或者您可以查看以下答案:https://stackoverflow.com/a/32545850/2016129以便在不需要nodeIntegration的情况下下载文件。
还有needle,这是对较大请求的较小替代方案,当然也支持Streams。