PHP - Devolver fichero blob (PDF) de una base de datos y mostrar en la web

 
Vista:
sin imagen de perfil
Val: 12
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Devolver fichero blob (PDF) de una base de datos y mostrar en la web

Publicado por Álvaro (3 intervenciones) el 16/08/2020 14:05:16
Hola, estoy intentando enviar un archivo blob (pdf) desde el servidor a javascript y mostrarlo en la pantalla.

Creo que la parte de JavaScript está bien (miré varios ejemplos en foros). Me parece que el problema está en PHP.

¿Alguien sabe dónde está el fallo o que me falta?

Gracias de antemano

PHP CODE
---------------
1
return base64_encode($valor['fichero']); //fichero is a blob file (pdf) save in a mysql table. I also tried with 'echo'.

Javascript CODE
---------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var xhr = new XMLHttpRequest();
xhr.open("POST", "url/export_file.php");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.responseType = "blob";
xhr.onload = function(){
 
	if (this.status == 200) {
		var blob = new Blob([xhr.response], {type: 'application/pdf'});
     	const url = window.URL.createObjectURL(blob);
        window.open(url, "_blank");
  	}
 
};
xhr.send();
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 2.822
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Devolver fichero blob (PDF) de una base de datos y mostrar en la web

Publicado por joel (857 intervenciones) el 17/08/2020 12:40:53
Hola Alvaro, si la llamada al php no es una función, tiene que ser echo en vez de return...

Si llamas al archivo PHP (url/export_file.php) directamente desde el navegador te muestra el contenido del archivo pdf?

Porque lo conviertes a base64?

Aquí te he dejado tu ejemplo funcionando correctamente:
https://www.lawebdelprogramador.com/codigo/JavaScript/6420-Mostrar-un-documento-PDF-en-un-iframe-con-AJAX.html

El ejemplo lo he mostrado en un iframe... ya que no hay intervención del usuario y me bloque la apertura de la nueva pestaña.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Devolver fichero blob (PDF) de una base de datos y mostrar en la web

Publicado por Álvaro (3 intervenciones) el 17/08/2020 13:46:46
Hola Joel,

Gracias por tu comentario y el ejemplo, pero no es exactamente el caso que necesito resolver.

Lo que quiero es sacar un pdf propio de un cliente que tengo guardado en un campo blob de la bbdd (he leído que es más seguro que tenerlo en un directorio) y enviarlo directamente como respuesta a la página web, para que el usuario lo abra y se lo pueda descargar (sin generar fichero en el proceso).

Yo obtengo de la BBDD el campo blob, que lo tengo en $valor['fichero']. Probé a enviar con echo y no funcionó, por eso probé también con return y con la función base64_encode (en algún ejemplo vi algo así para mandar datos no de texto, binarios).

No me funciona y creo, no estoy seguro, que el problema puede estar en la parte php. Al abrir en el navegador da error, pero veo que manda datos (tamaño pdf). Puede ser algo más que tengo que indicar para reconstruir en navegador estos datos (fichero pdf).

Gracias igual por tu aportación

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Devolver fichero blob (PDF) de una base de datos y mostrar en la web

Publicado por Álvaro (3 intervenciones) el 19/08/2020 08:18:13
Hola,

Ya conseguí resolverlo.

Falta la cabecera en el código PHP. También incluí limpieza de buffer para mejorar código.

1
2
3
4
5
ob_clean(); //clear the buffer
header('content-type: application/pdf');
header('content-disposition: inline; filename="Test.pdf"');
echo $valor['fichero'];
ob_end_flush();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar