React - Как обслуживать большой zip-файл, отправленный API, как байтовый массив - PullRequest
0 голосов
/ 01 сентября 2018

Я пишу приложение для загрузки набора файлов изображений, упакованных в zip-архив.

Фронтенд - это приложение реакции, вызов POST дает бэкэнду список файлов. Затем бэкэнд возвращает почтовый индекс, содержащий файлы.

Вот код переднего конца:

 onClickDownload = async () => {

    const {markedFileList} = this.state;

    let payload = {
      value: markedFileList,
    };

    const options = {
      method: 'POST',
      headers: {
        'accept': 'application/json',
        'content-type': 'application/x-www-form-urlencoded'
      },
      data: JSON.stringify(payload),
      url: `http://` + getHostAndPort() + `/rest/photo/toZip`,
    };
    axios(options).then(result => {
       this.downloadBlob(result.data, "file.zip", "application/zip");
    });
  }

Со стороны сервера, метод "toZip" реализован, как описано в последнем сообщении этой темы: Spring REST - создайте файл .zip и отправьте его клиенту

Я пытался поместить контент в разметку и смоделировать щелчок по нему. Я получаю zip-файл «file.zip», содержащий один файл с именем «file», который не читается, даже если извлечен и переименован в file2.zip

file.zip | --file

  downloadBlob(data, filename, type) {
    var file = new Blob([data], {type: type});
    if (window.navigator.msSaveOrOpenBlob) // IE10+
        window.navigator.msSaveOrOpenBlob(file, filename);
    else { // Others
        var a = document.createElement("a"),
                url = URL.createObjectURL(file);
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        setTimeout(function() {
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);
        }, 0);
    }
  }

Я видел FileSavec lib: https://github.com/eligrey/FileSaver.js Проблема: я хочу предоставить zip-файл с изображением, размер которого может превышать 500 МБ, что является пределом библиотеки. Я нашел пример, но не адаптированный для> 1 ГБ файла Как сохранить двоичные данные ZIP-файла в Javascript?

Я также пытался использовать нативный интерфейс fs https://disjoint.ca/til/2017/09/20/how-to-download-a-binary-file-using-axios/

но это для операций на стороне сервера по Дану: https://github.com/facebook/create-react-app/issues/3988

Я не хочу генерировать zip на серверной части, хранить его и обслуживать через определенный URL, потому что я не хочу управлять очисткой zip после загрузки.

Есть ли простой способ просто взять байтовый массив и просто попросить клиента сохранить его?

Большое спасибо за помощь

С уважением,

user7245912

...