Angular 7 инициирует загрузку файла браузера с сервера с авторизацией - PullRequest
1 голос
/ 05 апреля 2019

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

У нас есть служба, которая возвращает некоторые статические файлы (pdf), и для вызова этого API требуется авторизация. Поэтому я вызываю API, используя следующий метод:

  download(uri) {
    this.http.get(uri, {
      headers: {
        'Authorization': 'Bearer ' + token,
        'Accept':'application/pdf'
      }
    }).subscribe(()=>{});

но что этот метод на самом деле делает - он сначала загружает контент в память, а затем отображает его в списке загруженных файлами браузера. То, что я хотел бы иметь - вместо того, чтобы сначала загружать файл в память браузера, я бы хотел, чтобы браузер отвечал за загрузку этого файла и отображение хода загрузки.

Пожалуйста, дайте мне знать, если вам нужны дополнительные сведения.

P.S. сервис отвечает заголовком Content-Disposition: приложение

1 Ответ

0 голосов
/ 05 апреля 2019

На самом деле вам нужно использовать blob, так как вы используете вызов ajax. сначала установите https://github.com/eligrey/FileSaver.js#readme, затем

import { saveAs } from 'file-saver';

download(uri) {
this.http.get(uri, {
  headers: {
    'Authorization': 'Bearer ' + token,
     responseType: 'blob' 
  }
}).subscribe((res)=>{
var blob = new Blob(res, {type: "application/pdf"});
saveAs(blob, "file.pdf");
});
  • Ваш сервер должен возвращать байты массива

UPDATE Если вы хотите получать события прогресса загрузки, вы можете добавить observe: 'events' посмотрите прогресс загрузки

Другой вариант

  • Вы можете отправить первый запрос ajax на сервер и на стороне сервера генерировать случайный URL, который можно использовать один раз для загрузки файла

  • Затем используйте этот пример и передайте полученную ссылку в href и вызовите событие click. как этот пример

    function download(filename, link) {
     var element = document.createElement('a');
     element.setAttribute('href', link);
     element.setAttribute('download', filename);
    
     element.style.display = 'none';
     document.body.appendChild(element);
    
     element.click();
    
    document.body.removeChild(element);
    }
    
...