Ta funkcja nie jest jeszcze zaimplementowana w obsłudze protokołu HTTP.
Jako obejście, należy rozszerzyć klasę BrowserXhr
z Angular2 jak opisano poniżej, aby ustawić responseType
do blob
na bazowym obiektu XHR:
import {Injectable} from 'angular2/core';
import {BrowserXhr} from 'angular2/http';
@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
constructor() {}
build(): any {
let xhr = super.build();
xhr.responseType = "blob";
return <any>(xhr);
}
}
Następnie trzeba owinąć ładunek odpowiedzi na Blob
przedmiot i użyć FileSaver bibliotekę, aby otworzyć okno pobierania:
downloadFile() {
this.http.get(
'https://mapapi.apispark.net/v1/images/Granizo.pdf').subscribe(
(response) => {
var mediaType = 'application/pdf';
var blob = new Blob([response._body], {type: mediaType});
var filename = 'test.pdf';
saveAs(blob, filename);
});
}
The FileSaver biblioteki muszą być zawarte w pliku HTML:
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2014-11-29/FileSaver.min.js"></script>
Zobacz ten plunkr: http://plnkr.co/edit/tfpS9k2YOO1bMgXBky5Y?p=preview
Niestety Spowoduje to ustawienie responseType
dla wszystkich żądań AJAX. Aby móc ustawić wartość tej właściwości, istnieje więcej aktualizacji do wykonania w klasach XHRConnection
i Http
.
jako odniesienia zobaczyć te linki:
Edytuj
po przemyśleniu trochę więcej, myślę, że można wykorzystać hierarchicznych wtryskiwacze i skonfigurować ten dostawca tylko na poziomie komponentu, który wykonuje es pobieranie:
@Component({
selector: 'download',
template: '<div (click)="downloadFile() ">Download</div>'
, providers: [
provide(CustomBrowserXhr,
{ useClass: CustomBrowserXhr }
]
})
export class DownloadComponent {
@Input()
filename:string;
constructor(private http:Http) {
}
downloadFile() {
this.http.get(
'https://mapapi.apispark.net/v1/images/'+this.filename).subscribe(
(response) => {
var mediaType = 'application/pdf';
var blob = new Blob([response._body], {type: mediaType});
var filename = 'test.pdf';
saveAs(blob, filename);
});
}
}
Ta korekcja będzie zastosowanie tylko dla tego komponentu (nie zapomnij usunąć odpowiednie dostarczenie gdy ładowanie początkowe aplikacji). Komponent do pobrania może być używany w następujący sposób:
@Component({
selector: 'somecomponent',
template: `
<download filename="'Granizo.pdf'"></download>
`
, directives: [ DownloadComponent ]
})
Wygląda jak obsługa blob() i arrayBuffer() będzie w Ng2 RC5, już wkrótce. – Dave
Oto odpowiedź zgodna z przeglądarką Internet Explorer i przeglądarką Chrome https://stackoverflow.com/a/48467727/3926504 –