Скачать двоичные файлы с Angular 7 - Получение поврежденных файлов - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь реализовать простую функцию загрузки с помощью Angular 7, но получаю поврежденные файлы.

Файлы (jpg, pdf, zip файлы) размещены в облаке, и я получаюон использует Express Server и следующий код:

   var url = getBaseUrl() + '/files/' + filename;
   cloudGet(url, getHeaders(req), function (err, file) {
    if (err) {
      ...
    } else {
      res.setHeader('Content-disposition', 'attachment');
      res.setHeader('Content-type', 'application/octet-stream');
      res.setHeader('Content-Transfer-Encoding', 'binary');
      res.end(file, 'binary');
    }
  });

Заголовок файла, который я получаю, выглядит хорошо, поэтому я думаю, что эта часть работает.

В Angular у меня естьследующий код: Для службы, которая получает файл, я попробовал следующие решения:

downloadResource(path: string) {
 return this.httpClient.get(path, {responseType: 'blob'});
}

, и я также попробовал это решение:

downloadResource2(path: string): Observable<Blob> {
 return this.httpClient.get<Blob>(path,
  { headers: new HttpHeaders({
     'accept': 'application/octet-stream',
     'content-type': 'application/json'}),
    responseType: 'blob' as 'json'
  });
 }

В моем компоненте у меня есть следующий код:

downloadFile(filename: string) {
 const downloadUrl = this.apiUrl + '&' + 'filename=' + filename;

 this.apiService.downloadResource(downloadUrl).subscribe(data => {
  const blob = new Blob([data], {type: 'application/octet-stream'});
  const downloadURL = window.URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = downloadURL;
  link.download = filename;
  link.click();
 });
}

Это загружает файлы в мою папку загрузки, но все файлы повреждены (кроме файлов .json).PDF открывается, но он пуст.Я что-то упустил?

1 Ответ

0 голосов
/ 30 января 2019

Я решил проблему, изменив код в экспрессе на:

var url = getBaseUrl() + '/files/' + filename;
  request({
      method: "GET",
      url: url,
      headers: getHeaders(req)
  }).pipe(res);
...