使用Fetch API和fs.createWriteStream对文件进行流式响应
问题描述:
我正在创建一个Electron应用程序,我想将一个图像流式传输到一个文件中(所以基本上可以下载它)。使用Fetch API和fs.createWriteStream对文件进行流式响应
我想使用本地提取API,因为请求模块会有很大的开销。
但对响应无管的方法,所以我不能做这样的事情
fetch('https://imageurl.jpg')
.then(response => response.pipe(fs.createWriteStream('image.jpg')));
所以,我怎么能结合fetch
和fs.createWriteStream
?
答
我明白了。我做了一个将响应转换为可读流的函数。因此,与它
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')));
答
Fetch并不能真正与Streams一起使用,因为Fetch API是基于浏览器的,Streams是nodejs的一个东西。 electron-fetch模块似乎为你解决了这个问题。或者你可以看看这个答案:https://stackoverflow.com/a/32545850/2016129有一种下载文件的方式,而不需要nodeIntegration。
还有needle,这是一个更小的替代方案,它可以处理更大的请求,这当然支持Streams。