He estado intentando mostrar un archivo pdf que obtengo como un blob de una $http.post
respuesta. El pdf debe mostrarse dentro de la aplicación usando <embed src>
por ejemplo.
Me encontré con un par de publicaciones de pila pero de alguna manera mi ejemplo no parece funcionar.
JS:
De acuerdo con este documento , continué e intenté ...
$http.post('/postUrlHere',{myParams}).success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = fileURL;
});
Ahora, por lo que tengo entendido, fileURL
crea una URL temporal que el blog puede usar como referencia.
HTML:
<embed src="{{content}}" width="200" height="200"></embed>
No estoy seguro de cómo manejar esto en Angular, la situación ideal sería (1) asignarlo a un alcance, (2) 'preparar / reconstruir' el blob en un pdf (3) pasarlo al HTML usando <embed>
porque yo desea mostrarlo dentro de la aplicación.
He estado investigando durante más de un día, pero de alguna manera parece que no puedo entender cómo funciona esto en Angular ... Y supongamos que las bibliotecas de visores de PDF no eran una opción.
Respuestas:
En primer lugar es necesario establecer la
responseType
aarraybuffer
. Esto es necesario si desea crear un blob de sus datos. Consulte Enviar_y_Recibir_datos_binarios . Entonces su código se verá así:La siguiente parte es que debe usar el servicio $ sce para hacer que angular confíe en su URL. Esto se puede hacer de esta manera:
No olvide inyectar el servicio $ sce .
Si todo esto está hecho, ahora puede incrustar su pdf:
fuente
$http.get
con uno completo, especificando elresponseType
campo:{ 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' }
Y funciona :)response.data
lugar deresponse
, así:var file = new Blob([response.data], {type: 'application/pdf'});
Yo uso AngularJS v1.3.4
HTML:
Controlador JS:
Servicios JS:
Servicios web Java REST - Spring MVC:
fuente
Las sugerencias de Michael funcionan como un encanto para mí :) Si reemplaza $ http.post con $ http.get, recuerde que el método .get acepta 2 parámetros en lugar de 3 ... aquí es donde se pierde el tiempo ...;)
controlador:
ver:
fuente
responseType:'arraybuffer'
, ¡me acaba de ahorrar un par de horas de sueño! +1$scope.content = $sce.trustAsResourceUrl(fileURL);
con$window.open(fileURL, '_self', '');
y abra el archivo en pantalla completa.Enfrenté dificultades al usar "window.URL" con Opera Browser, ya que resultaría en "undefined". Además, con window.URL, el documento PDF nunca se abrió en Internet Explorer y Microsoft Edge (permanecería esperando para siempre). Se me ocurrió la siguiente solución que funciona en IE, Edge, Firefox, Chrome y Opera (no he probado con Safari):
¡Avísame si te ayudó! :)
fuente
Agregar responseType a la solicitud que se realiza desde angular es de hecho la solución, pero para mí no funcionó hasta que configuré responseType en blob , no en arrayBuffer. El código se explica por sí mismo:
fuente
'blob'
tipo es posible escribir más corto:FileSaver.saveAs(response.data, getFileNameFromHttpResponse(response));
No es necesario crearBlob
He luchado durante los últimos días tratando de descargar archivos PDF e imágenes, todo lo que pude descargar fueron archivos de texto simples.
La mayoría de las preguntas tienen los mismos componentes, pero tomó un tiempo averiguar el orden correcto para que funcionara.
Gracias @Nikolay Melnikov, su comentario / respuesta a esta pregunta fue lo que hizo que funcionara.
En pocas palabras, aquí está mi llamada de backend del servicio AngularJS:
Desde mi controlador:
fuente
Respuesta más reciente (para Angular 8+):
fuente
Una sugerencia de código que acabo de usar en mi proyecto usando AngularJS v1.7.2
fuente