首页 > 解决方案 > 使用 Fetch-node.buffer() 在 Node 中下载二进制文件 - 文件未正确解码

问题描述

重要更新:我发现我在 Apple Mac 上没有这样的问题!仅在 Windows 7 上

在此处输入图像描述

同一个 pdf 文件被下载了两次。我可以打开一个文件,第二个文件 - 我无法打开。也许有人可以给我任何建议或知道解决方案?谢谢!

在此处输入图像描述

我使用 fetch-node 库在 Electron.js 中下载二进制文件。当文件很小时没有问题,但是对于大文件,我会定期(不是经常)看到文件解码的问题。我无法打开这样的文件!我还发现一些文件有 5KB 大小,但应该有 10Mb+ 大小!

function fastFetch(url, dest, fileName, callback) {
  console.log("fastFetch-------------------------------------------------------");

  //import fetch from 'node-fetch';
  fetch(url)
    .then(res => res.buffer())
    .then(buffer => {

      const settings = {
        flags: 'w',
        encoding: null, //not applicable / no changes
        mode: 0o666
      };

      try {
        fs.writeFileSync(dest, buffer, settings);

        let msgOK = {
          filename: fileName,
          status: 'OK',
          text: `File downloaded successfully`
        }
        if (callback) callback(msgOK);
        console.log(msgOK.text);
        isLoading = false; //IMPORTANT! 

      } catch (err) {
        console.error(err.stack || err.message);

        let msgErr = {
          filename: fileName,
          status: 'ERROR',
          text: `Error in file downloading ${err.message}`
        }
        ERRORS.push(err);
        if (callback) callback(msgErr);
      }

    })
}

带有 WriteStream 的版本 - 相同的问题 - 一个文件可以打开,另一个文件由于编码问题而无法打开:

function fetchWithFIleStream(url, dest, fileName, callback) {
  console.log("fetch With FIle Stream-------------------------------------------------------");
  //import fetch from 'node-fetch';
  fetch(url)
    .then(res => {
      console.log("--------------------------------------------")
      //console.log(res);
      console.log(res.ok);
      console.log(res.status);
      console.log(res.statusText);
      console.log(res.headers.raw());
      console.log(res.headers.get('content-type'));
      console.log("--------------------------------------------")
      //ERROR: Not a function: res.setEncoding('binary');
      return res.buffer();
    })
    .then(buffer => {

      const settings = {
        flags: 'w',
        encoding: null, //default: 'utf8',
        fd: null,
        mode: 0o666,
        autoClose: true
      };

      // response.pipe(fs.createWriteStream(dest, settings));
      var wstream = fs.createWriteStream(dest, settings);
      wstream.write(buffer);

      wstream.on('finish', function () {
        //console.log('END------------------------------------------------------')
        let msgOK = {
          filename: fileName,
          status: 'OK',
          text: `File downloaded successfully`
        }

        if (callback) callback(msgOK);
        console.log(msgOK.text);
        isLoading = false; //IMPORTANT!

        wstream.end();

      });

      wstream.end();

    })
}

标签: node.jsfile-transfer

解决方案


推荐阅读