как сохранить байтовый массив в виде zip в угловых - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь загрузить (используя FileSaver.saveAs) массив байтов, получаемый с сервера (nodejs \ express) в виде почтового индекса.Мне удается загрузить его в формате zip, но он не открывается (это неверно).У меня было мало недоразумений относительно того, как должны быть определены данные - тип контента, responseType как на сервере, так и на клиенте, должен ли я преобразовать его в большой двоичный объект и т. Д.), Но я думаю, что я перебил их подробнымкод ниже.Проблема заключается в последней функции, в функции exportAsZip - данные достигают нужного размера, но , преобразовывая их в BLOB-объекты, раздувает их и, возможно, повреждает.Вот мой код (на стороне сервера - node.js-express с использованием функции промежуточного программного обеспечения): ЭТО УЖЕ ОБНОВЛЕНО КАК ФИКСИРОВАННЫЙ КОД: Маршрутизатор Express-router:

router.use(<some route>,(req, res, next) => {
return getData(req.query).then((dataResult) => 
{
 {
    res.contentType('application/zip');
    return res.send([dataResult]); //Data result is byte array
 }).catch((err) => { 
        console.error(err);
    });
});

Всторона клиента (угловая): это функция компонента:

downloadAsZip()
{
  let fileName : string = <fileName>;
this.srv.getData().subscribe(result => 
  {  
 // const blob = new Blob([result], { type: 'application/octet-stream' }) 
  /*This is the needed fix:*/
    const byteArray = new Uint8Array(result);
    const blob = new Blob([byteArray]);


    this.fileService.exportAsZip(blob, fileName);
  },
  error => console.log(error) 
);

}

Это код srv.getData:

getData() : Observable<any>
{
   return this.http.get(<path>, /*{ responseType: 'blob' } - not needed*/) 
}

Это функция fileService(exportAsZip):

exportAsZip(data, fileName)
{
    /*The data is with a correct size, but converting it to a blob object inflate its size*/
    /*this should be removed also*/

    //const blobData: Blob = new Blob([data], {type: 'application/zip'});
    FileSaver.saveAs(/*blobD*/data, fileName + '.zip');
}

1 Ответ

0 голосов
/ 24 июня 2019

Исправлена ​​проблема. Основное изменение заключается в преобразовании данных байтового массива в Uint8Array, а затем создании большого двоичного объекта, который будет сохранен с помощью FileSaver.saveAs.Также удален {responseType: 'blob'} из заголовка запроса get.Вышеуказанный код теперь исправлен!

...