使用Fetch API和fs.createWriteStream对文件进行流式响应

问题描述:

我正在创建一个Electron应用程序,我想将一个图像流式传输到一个文件中(所以基本上可以下载它)。使用Fetch API和fs.createWriteStream对文件进行流式响应

我想使用本地提取API,因为请求模块会有很大的开销。

但对响应无管的方法,所以我不能做这样的事情

fetch('https://imageurl.jpg') 
    .then(response => response.pipe(fs.createWriteStream('image.jpg'))); 

所以,我怎么能结合fetchfs.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。