代码之家  ›  专栏  ›  技术社区  ›  digory doo

从URL获取blob并写入文件

  •  0
  • digory doo  · 技术社区  · 8 年前

    我在努力 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 . 我要把一个球传给 fs 不了解斑点,只写 [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 . 斑点大小 显示正确的大小,所以 取来 似乎很成功。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Paul    8 年前

    好的,所以从 MDN Docs blob不是一个缓冲区,这是写入文件系统所需要的。

    我认为你最好从响应中得到缓冲区,比如:

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

    不过,根据文件的大小,最好的选择可能是跳过 .writeFile 完全发挥作用,取而代之的是管道流。