Используйте Nodestream на веб-интерфейсе с JSZip - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь использовать JSZip с Nodestream и реагировать на интерфейс. Цель состоит в том, чтобы загрузить все файлы из функции. Возможно ли заархивировать файлы во внешнем интерфейсе, используя nodestream, и сгенерировать nodestream. Если это возможно, как мы можем использовать канал для потоковой передачи данных?

Я смог заархивировать и загрузить файлы, используя async и generateasync. Однако метод async и метод generateAsync хранят полный результат в памяти, но не замораживают браузер.

public downloadAttachmentsAsZip = () => {

    var zip = new JSZip();
    var count = 0;
    var zipFileName = this.state.requestObject.RequestID;
    this.state.requestObject.Folder.Files.forEach(f => {
      JSZipUtils.getBinaryContent(f.ServerRelativeUrl, (err, data) => {
        if (err) {
          throw err;
        }

        zip
          .file(f.name, data, { binary: true })
          .nodeStream()
          .pipe(fs.createWriteStream('/tmp/' + f.name))
          .on('finish', () => {

            console.log("text file written.");
          });

        count++;

        if (count == this.state.requestObject.Folder.Files.length) {

          zip
            .generateNodeStream({ streamFiles: true })
            .on('end', () => {
              console.log("zip stream ended.");
            })
            .pipe(fs.createWriteStream('out.zip'))
            .on('finish', () => {
              console.log("out.zip written.");
            });
        }
      });
    });
  }

Насколько я знаю, файловый поток не поддерживается на внешнем интерфейсе. Есть ли другой способ добиться этой функциональности?

...