J'ai essayé d'afficher le fichier pdf que j'obtiens comme un blob d'une $http.post
réponse. Le pdf doit être affiché dans l'application en utilisant <embed src>
par exemple.
Je suis tombé sur quelques articles de pile, mais mon exemple ne semble pas fonctionner.
JS:
D'après ce doc , j'ai continué et j'ai essayé ...
$http.post('/postUrlHere',{myParams}).success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = fileURL;
});
Maintenant, d'après ce que je comprends, fileURL
crée une URL temporaire que le blog peut utiliser comme référence.
HTML:
<embed src="{{content}}" width="200" height="200"></embed>
Je ne sais pas comment gérer cela dans Angular, la situation idéale serait de (1) l' attribuer à une portée, (2) `` préparer / reconstruire '' le blob en pdf (3) le transmettre au HTML en utilisant <embed>
parce que je souhaitez l'afficher dans l'application.
Je fais des recherches depuis plus d'un jour maintenant, mais je n'arrive pas à comprendre comment cela fonctionne dans Angular ... Et supposons simplement que les bibliothèques de visionneuse PDF n'étaient pas une option.
Réponses:
Tout d'abord, vous devez définir le
responseType
surarraybuffer
. Cela est nécessaire si vous souhaitez créer un objet blob de vos données. Voir Sending_and_Receiving_Binary_Data . Donc, votre code ressemblera à ceci:La partie suivante est que vous devez utiliser le service $ sce pour rendre votre URL de confiance angulaire. Cela peut être fait de cette manière:
N'oubliez pas d'injecter le service $ sce .
Si tout cela est fait, vous pouvez maintenant intégrer votre pdf:
la source
$http.get
par une méthode complète, en spécifiant leresponseType
champ:{ 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' }
Et ça marche :)response.data
au lieu deresponse
, comme ceci:var file = new Blob([response.data], {type: 'application/pdf'});
J'utilise AngularJS v1.3.4
HTML:
Contrôleur JS:
Services JS:
Services Web Java REST - Spring MVC:
la source
Les suggestions de michael fonctionnent comme un charme pour moi :) Si vous remplacez $ http.post par $ http.get, rappelez-vous que la méthode .get accepte 2 paramètres au lieu de 3 ... c'est là que j'ai perdu mon temps ...;)
manette:
vue:
la source
responseType:'arraybuffer'
, vient de me sauver quelques heures de sommeil! +1$scope.content = $sce.trustAsResourceUrl(fileURL);
avec$window.open(fileURL, '_self', '');
et ouvrir le fichier sur plein écran.J'ai rencontré des difficultés à utiliser "window.URL" avec Opera Browser car il en résulterait "undefined". De plus, avec window.URL, le document PDF ne s'est jamais ouvert dans Internet Explorer et Microsoft Edge (il resterait en attente pour toujours). J'ai proposé la solution suivante qui fonctionne dans IE, Edge, Firefox, Chrome et Opera (je n'ai pas testé avec Safari):
Faites-moi savoir si cela a aidé! :)
la source
L'ajout de responseType à la requête faite à partir d'angular est en effet la solution, mais pour moi, cela n'a pas fonctionné tant que j'ai défini responseType sur blob , pas sur arrayBuffer. Le code est explicite:
la source
'blob'
type, il est possible d'écrire plus court:FileSaver.saveAs(response.data, getFileNameFromHttpResponse(response));
Pas besoin de créerBlob
J'ai eu du mal ces derniers jours à essayer de télécharger des fichiers PDF et des images, tout ce que j'ai pu télécharger était de simples fichiers texte.
La plupart des questions ont les mêmes éléments, mais il a fallu un certain temps pour trouver le bon ordre pour que cela fonctionne.
Merci @Nikolay Melnikov, votre commentaire / réponse à cette question est ce qui l'a fait fonctionner.
En un mot, voici mon appel au backend du service AngularJS:
Depuis mon contrôleur:
la source
Réponse la plus récente (pour Angular 8+):
la source
Une suggestion de code que je viens d'utiliser dans mon projet en utilisant AngularJS v1.7.2
la source