Получите zip-файл из серверной части

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

Бэкэнд-функция выглядит так:

        import { saveAs } from 'file-saver';

  @Get('encrypt/all')
  async encryptAllRecipes() {
    const zip: JSZip = new JSZip();
    const allRecipes: RecipeEntity[] = await this.listAllRecipes();
    for(const recipe of allRecipes) {
      const encryptedRecipeStr: string = await this.encryptRecipe(recipe);
      zip.file(`${recipe.name}.enc`, encryptedRecipeStr);
    }
    
    const buffer: Buffer = await (zip.generateAsync({type:"nodebuffer"}, function updateCallback(metadata) {
      console.log("progression: " + metadata.percent.toFixed(2) + " %");
    }));

    return buffer;
  }

Ответ этой функции выглядит так (я усек его, используя "..." внутри, потому что он был слишком большим)

      {"type":"Buffer","data":[80,75,3,4,...,0,0,0,19,0,109,4,0,0,121,17,0,0,0,0]}

Затем в интерфейсе я хотел бы загрузить zip-файл:

      exportAllToEncryptedFile() {
  const headers = new HttpHeaders();
  const params: HttpParams = new HttpParams();
  return this._httpRequestsManager
    .get(`${this._constants.encryptAllRecipesAddress}`, {headers, params, responseType: 'arraybuffer'})
    .subscribe((response: any) => {
        const blob = new Blob([response], { type: 'arraybuffer' });
        saveAs(blob, `encryptedRecipes.zip`);
      },
      (err: HttpErrorResponse) => {
        console.log(err);
      }
    );
}

Файл не может быть прочитан как zip, он содержит json, возвращенный серверной частью. Я пробовал много вещей, среди которых:

  • Возврат буфера с использованием кодировки base64 из бэкэнда и декодирование этой строки спереди
  • Использование responseType с blob и arraybuffer
  • Сохранение поля response.data в файле вместо всего ответа
  • Определение типа содержимого заголовка: 'application / zip', 'text / plain', to 'multipart / form-data'

Я не очень разбираюсь в http-запросах. Как я мог с этим справиться?

Спасибо.

Изменить: из бэкэнда, если я записываю буфер в файл напрямую, результирующий файл будет правильным.

      fs.writeFile('C:\\ziptests\\testBlob.zip', buffer, () => {
   console.log('file written');
});

1 ответ

Я думаю, что более простым решением для загрузки zip-файлов является создание файла в бэкэнде и отправка пути (в виде ссылки) на интерфейс и просто href со ссылкой, чтобы браузер инициировал загрузку

Другие вопросы по тегам