Получите 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 со ссылкой, чтобы браузер инициировал загрузку