Загрузка бинарных файлов в Node с помощью Fetch-node.buffer () - файл не был правильно декодирован - PullRequest
0 голосов
/ 27 апреля 2018

Важное обновление: я обнаружил, что У меня нет такой проблемы на Apple Mac! Только на Windows 7 !

enter image description here

Один и тот же файл PDF был загружен дважды. Один файл я могу открыть, второй - я не могу открыть. Может быть, кто-нибудь может дать мне какой-нибудь совет или узнать решение? Спасибо!

enter image description here

Я использую библиотеку fetch-node для загрузки бинарных файлов в Electron.js. Когда файлы маленькие, проблем нет, но с большими файлами я периодически вижу (не постоянно) проблему с декодированием файлов. Я не могу открыть такие файлы! Также я обнаружил, что некоторые файлы имеют размер 5 КБ, но должны иметь размер 10 МБ +!

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();

    })
}
...