从 URL 获取 blob 并写入文件

问题描述 投票:0回答:4

我正在尝试

fetch
来自服务器的一些二进制数据(MP3),然后将其存储在文件中:

var fs = require ('fs');
var fetch = require ('node-fetch');

fetch (
   audioUrl,
   {
      method: 'GET',
      headers: { 'Accept': '*/*' }
   }
)
.then ((res) => res.blob())
.then ((blob) => {
    console.log ('Blob size: ', blob.size);

    fs.writeFile (
        `filename.mp3`,
        blob,  // BUG HERE
        (err) => {
            if (err) {
                console.log (`Error writing audio ${audioIdx}`, err);
            }
        }
    );
})

问题标记为

BUG HERE
。我将一个 blob 传递给
fs
,它不理解 blob,只是写
[object Blob]
。我还尝试了以下方法:

blob                                // writes [object Blob]
new Uint8Array (blob)               // writes empty file
Buffer.from (new Uint8Array (blob)) // writes empty file
new Buffer (blob, 'binary')   // Error: argument is not a Buffer

以上都不起作用。如何正确地做到这一点?

请注意,我在调用

blob.size
之前先记录
writeFile
blob.size
显示了正确的尺寸,因此
fetch
似乎成功了。

node.js blob fs fetch-api
4个回答
10
投票

简单且有效(在nodejs中使用Buffer API)

const fetch = require('node-fetch');
const Buffer = require('buffer').Buffer 
const fs = require('fs');
fetch("https://example.com/file.mp3", {
  "headers": {},
  "method": "GET"
}).then(function(resp) {
    return resp.blob();
}).then(async function(blob) {
    var buffer = await blob.arrayBuffer();
    buffer = Buffer.from(buffer)
    fs.createWriteStream('file.mp3').write(buffer);
})

9
投票

好的,所以从 MDN Docs 来看,Blob 不是缓冲区,而缓冲区是写入文件系统所需的。

我认为你最好从响应中获取缓冲区,例如:

.then(res => res.buffer())
.then(/* write your file here */)

尽管取决于文件有多大,您最好的选择可能是完全跳过

.writeFile
函数并转而使用管道流。


9
投票

您可以使用

fs.createWriteStream
将响应流式传输到文件。

fetch(
    audioUrl,
    {
        method: 'GET',
        headers: { 'Accept': '*/*' }
    }
).then(res => {
    new Promise((resolve, reject) => {
        const dest = fs.createWriteStream(`filename.mp3`);
        res.body.pipe(dest);
        res.body.on('end', () => resolve());
        dest.on('error', reject);
    })
});

0
投票

第二种选择:

const cb=(e)=>{
    if(e){
        console.log(e);     
    }
}
const download=(url,destpath)=>{
    fetch(url)
    .then(response=>response.blob())//text blob json
    .then(async (blob) => {
        var buffer = await blob.arrayBuffer();
        buffer = Buffer.from(buffer)
        fs.writeFile(destpath,buffer, cb );
    }).catch(err=>console.log(err))
} 
© www.soinside.com 2019 - 2024. All rights reserved.