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

时间:2017-06-21 10:01:51

标签: javascript electron fs fetch-api

我正在创建一个Electron应用程序,我想将图像流式化为文件(所以基本上下载它)。

我想使用本机Fetch API,因为请求模块将是一个很大的开销。

但是响应没有管道方法,所以我不能做像

这样的事情
fetch('https://imageurl.jpg')
    .then(response => response.pipe(fs.createWriteStream('image.jpg')));

那么如何合并fetchfs.createWriteStream

2 个答案:

答案 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。