Ich habe versucht, eine PDF-Datei anzuzeigen, die ich als Blob aus einer $http.post
Antwort erhalte . Das PDF muss in der App mit angezeigt werden<embed src>
.
Ich bin auf ein paar Stapelpfosten gestoßen, aber irgendwie scheint mein Beispiel nicht zu funktionieren.
JS:
Laut diesem Dokument habe ich weiter versucht ...
$http.post('/postUrlHere',{myParams}).success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = fileURL;
});
Soweit ich weiß, fileURL
wird nun eine temporäre URL erstellt, die das Blog als Referenz verwenden kann.
HTML:
<embed src="{{content}}" width="200" height="200"></embed>
Ich bin mir nicht sicher, wie ich damit in Angular umgehen soll. Die ideale Situation wäre, (1) es einem Bereich zuzuweisen, (2) den Blob in ein PDF 'vorzubereiten / neu zu erstellen', (3) ihn an den HTML-Code zu übergeben, <embed>
weil ich möchte es in der App anzeigen.
Ich habe seit mehr als einem Tag recherchiert, aber irgendwie kann ich nicht verstehen, wie das in Angular funktioniert ... Und nehmen wir einfach an, dass die PDF-Viewer-Bibliotheken da draußen keine Option waren.
Antworten:
Zunächst einmal müssen Sie die festlegen
responseType
zuarraybuffer
. Dies ist erforderlich, wenn Sie einen Blob Ihrer Daten erstellen möchten. Siehe Sending_and_Receiving_Binary_Data . Ihr Code sieht also folgendermaßen aus:Der nächste Teil ist, dass Sie den $ sce- Dienst verwenden müssen, damit Angular Ihrer URL vertraut. Dies kann folgendermaßen geschehen:
Vergessen Sie nicht, den $ sce- Service einzuschleusen .
Wenn dies alles erledigt ist, können Sie jetzt Ihr PDF einbetten:
quelle
$http.get
durch eine vollständige ersetzt und dasresponseType
Feld angegeben:{ url: "http://127.0.0.1:8080/resources/jobs/af471106-2e71-4fe6-946c-cd1809c659e5/result/?key="+$scope.key, method: "GET", headers: { 'Accept': 'application/pdf' }, responseType: 'arraybuffer' }
Und es funktioniert :)response.data
response
var file = new Blob([response.data], {type: 'application/pdf'});
Ich benutze AngularJS v1.3.4
HTML:
JS-Controller:
JS-Dienste:
Java REST-Webdienste - Spring MVC:
quelle
Michaels Vorschläge wirken wie ein Zauber für mich :) Wenn Sie $ http.post durch $ http.get ersetzen, denken Sie daran, dass die .get-Methode 2 Parameter anstelle von 3 akzeptiert ... hier wird meine Zeit verschwendet ...;)
Regler:
Aussicht:
quelle
responseType:'arraybuffer'
, habe mir nur ein paar Schlafstunden erspart! +1$scope.content = $sce.trustAsResourceUrl(fileURL);
mit$window.open(fileURL, '_self', '');
und die Datei auf Vollbild öffnen.Ich hatte Probleme bei der Verwendung von "window.URL" mit Opera Browser, da dies zu "undefiniert" führen würde. Außerdem wurde mit window.URL das PDF-Dokument in Internet Explorer und Microsoft Edge nie geöffnet (es würde für immer warten). Ich habe die folgende Lösung gefunden, die in IE, Edge, Firefox, Chrome und Opera funktioniert (nicht mit Safari getestet):
Lass es mich wissen, wenn es geholfen hat! :) :)
quelle
Hinzufügen response auf die Anforderung , die von Winkel hergestellt wird , ist in der Tat die Lösung, aber für mich ist es nicht funktioniert hat, bis ich festgelegt haben response zu Klecks , nicht zu Arraybuffer. Der Code ist selbsterklärend:
quelle
'blob'
FileSaver.saveAs(response.data, getFileNameFromHttpResponse(response));
Blob
Ich hatte in den letzten Tagen Probleme, PDFs und Bilder herunterzuladen. Alles, was ich herunterladen konnte, waren einfache Textdateien.
Die meisten Fragen haben die gleichen Komponenten, aber es hat eine Weile gedauert, bis die richtige Reihenfolge gefunden war, damit es funktioniert.
Vielen Dank an Nikolay Melnikov. Ihr Kommentar / Ihre Antwort auf diese Frage hat dazu beigetragen, dass es funktioniert hat.
Kurz gesagt, hier ist mein AngularJS Service-Backend-Aufruf:
Von meinem Controller:
quelle
Letzte Antwort (für Angular 8+):
quelle
Ein Vorschlag für Code, den ich gerade in meinem Projekt mit AngularJS v1.7.2 verwendet habe
quelle