PHP - Problemas al descargar un documento del paquete de office mediante PHP y SQL server

 
Vista:

Problemas al descargar un documento del paquete de office mediante PHP y SQL server

Publicado por Carmen (3 intervenciones) el 10/06/2020 05:18:52
Hola,

Tengo problema al descargar un documento del paquete de office (word, excel, power point), al momento de descargar el archivo lo hace perfectamente, el problema que al abrirlo me da un mensaje que el documento tiene un contenido no legible, creo que es un problema de la descodificacion del archivo, cabe recalcar que probe descargar un PDF y me lo muestra de manera correcta, el archivo lo guardo en la BD en base 64,

de antemano muchas gracias,

codigo de la descarga del archivo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
      include("Conexion/Conexion.php");
      $ID = $_GET['id'];
 
      $select = "SELECT * FROM [dbo].[TBL_COMENTARIOS] WHERE ID_Comentario = $ID";
      $result = sqlsrv_query($con,$select);
 
      while ($consulta = sqlsrv_fetch_array($result)){
      $datos = $consulta['Documento'];
      $tipo = $consulta['Tipo'];
      $fechaC = $consulta['Fecha']->format('d-M-Y h:i');
      $nombreA = $consulta['Nombre'];
 
      $archivoDecode = base64_decode($datos);
 
      header("Content-Description: File Transfer");
      header('Content-Type: $tipo');
      header("Content-Disposition: attachment; filename=".$nombreA."");
 
 
      echo $archivoDecode;
 
      }
?>
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 javier
Val: 1.381
Plata
Ha aumentado su posición en 2 puestos en PHP (en relación al último mes)
Gráfica de PHP

Problemas al descargar un documento del paquete de office mediante PHP y SQL server

Publicado por javier (364 intervenciones) el 10/06/2020 07:31:37
Hola,

es importante que estes enviando bien los headers sobre todo el TYPE (el tipo mime del archivo), esa podria ser la causa a demas que yo incluiria algun header mas.

1
2
3
4
5
6
7
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
//header("content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document");// para un archivo .odt
header("Content-type: application/". $file_type. "");
header("Content-disposition:  attachment; filename=". $file_download_name);
header("content-Transfer-Encoding: binary");

Y com almacenas este dato del tipo de archivo en la BBDD?

1
$tipo = $consulta['Tipo'];

como obtienes ese dato (ya se que de una consulta a la bbdd), por que yo uso la funcion finfo_file() y la clase que hay en PHP7, de esta manera obtienes el tipo MIME de cualquier archivo.

saludos
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

Problemas al descargar un documento del paquete de office mediante PHP y SQL server

Publicado por Carmen (3 intervenciones) el 10/06/2020 07:45:26
Hola Javier, gracias por ayudarme con este problema.

En efecto es el tipo de mime el del problema, los documentos que subí como prueba son de tipo .docx, hace un momento subí un documento con tipo .doc y me lo abre sin ningún mensaje, ni problema.

Ahora bien el problema es que todos los documentos a subir son de tipo .docx, xlsx etc...

De igual manera pondré en práctica la función finfo_file().
Gracias
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
Imágen de perfil de javier
Val: 1.381
Plata
Ha aumentado su posición en 2 puestos en PHP (en relación al último mes)
Gráfica de PHP

Problemas al descargar un documento del paquete de office mediante PHP y SQL server

Publicado por javier (364 intervenciones) el 10/06/2020 08:07:04
Hola,

el MIME correcto para un documento docx es:

1
header("content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document");

haz uno de prueba y descargalo, yo uso la misma manera que tu tienes para descargar y no tengo problemas al descargar ningun archivo de office.
Ahora, yo tengo los archivos fisicamete en el servidor, de la BBDD solo saco el nombre, despues añado la ruta a la carpeta del servidor y con la funcion fopen(); los leo con fread(); para despues enviarlo a descarga mediante un echo
No es muy recomendable guardar documentos completos en campos de la BBDD, no es eficiente y puede relentizar a la base si contiene unos campos con muchisimo texto.


saludos
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