Foros del Web » Programando para Internet » PHP »

Ver archivo PDF u otros

Estas en el tema de Ver archivo PDF u otros en el foro de PHP en Foros del Web. Saludos, Tengo el siguiente, subo archivos a la base de datos con un script (Cargar archivo) y luego para ver-lo he creado un link que ...
  #1 (permalink)  
Antiguo 24/12/2015, 05:35
 
Fecha de Ingreso: octubre-2015
Ubicación: Barcelona
Mensajes: 66
Antigüedad: 8 años, 7 meses
Puntos: 0
Pregunta Ver archivo PDF u otros

Saludos,

Tengo el siguiente, subo archivos a la base de datos con un script (Cargar archivo) y luego para ver-lo he creado un link que me abre el archivo en el navegador mismo.
Pero sólo me deja visualizar unos pocos pdfs, he ido probano y tengo la suposición que los otros archivos tienen un tamaño mayor.
Cuando intento ver estos archivos que no van, me sale "Failed to load PDF document".

No sé si mi suposición es correcta o si alguien se ha encontrado con un problema similar haber si podéis ayudar-me.

Muchas gracias, a continuación los códigos comentados.




Cargar archivo en la BBDD
Código HTML:
Ver original
  1.     <head>
  2.         <title></title>
  3.         <META http-equiv="Content-Type" CONTENT="text/html; charset=utf-8">
  4.     </head>
  5.  
  6.     <body bgcolor="#F75353">
  7.     <center>
  8.  
  9. <?php
  10.          
  11.        include '../header.php';
  12.    ?>
  13.     <?php
  14.  
  15.  
  16.    
  17.            require_once ('../conexion.inc.php');
  18.            $db1 = mysql_connect($servidor,$usuario,$password) or die("Error al conectar al DBMS.");
  19.            mysql_select_db($basedatos) or die("Error al conectar a la BD");
  20.          
  21.  
  22. set_time_limit(0);
  23.     // Datos de conexión a configurar
  24.    $directorio = "../../subidas/";
  25.  
  26.    // Recibo los datos
  27.            $IdRFQ = $_POST['txtidrfq'];
  28.            $Data = $_POST['txtdata'];
  29.  
  30.            $ProjectName = $_POST['txtProjectName'];
  31.  
  32.            $ProjectPartNombre = $_POST['txtProjectPartNumber'];
  33.  
  34.            $Customer = $_POST['txtCustomer'];
  35.  
  36.            $RMPartNumber = $_POST['txtRMPartNumber'];
  37.  
  38.            $Description = $_POST['txtDescription'];
  39.  
  40.            $Suppliers = $_POST['txtsupplier'];            
  41.            $Price = $_POST['txtprice'];  
  42.            $Cry2 = $_POST['txtcry2'];
  43.            $MOQ = $_POST['txtmoq'];
  44.            $Volume = $_POST['txtvolume'];        
  45.            $Investment = $_POST['txtinvestment'];
  46.  
  47.            $Delivery = $_POST['txtDelivery'];
  48.  
  49.                  
  50.            $Timing = $_POST['txttiming'];
  51.            $Cry = $_POST['txtcry'];
  52.            $Responsible = $_POST['txtResponsible'];
  53.            $Incoterms = $_POST['txtincoterms'];
  54.            $Comments = $_POST['txtcomments'];
  55.            
  56.            $nombre = '';
  57.            if(!empty($_FILES['archivo']['name']))
  58.            {
  59.                //aqui recibo el archivo
  60.                $nombre = $_FILES['archivo']['name'];
  61.                $tipo = $_FILES['archivo']['type'];
  62.                $tamano = $_FILES['archivo']['size'];
  63.  
  64.                // muevo el archivo del temporal al directorio definitivo
  65.                //move_uploaded_file($_FILES['archivo']['tmp_name'],$directorio.$nombre);
  66.                //asigno la ruta y nombre del archivo para almacenarlo
  67.                $fichero_subido = $directorio.$nombre;
  68.  
  69.                $fp = fopen($_FILES['archivo']['tmp_name'], "rb");
  70.                $binario = fread($fp, $tamano);
  71.                $binario = addslashes($binario);
  72.                fclose($fp);    
  73.  
  74.  
  75.                
  76.  
  77.                
  78.            }
  79.                        
  80.    $q1= "INSERT INTO rfq (idrfq, data, ProjectName,  ProjectPartNumber, Customer, RMPartNumber, Description, suppliers, Unitprice, cry2, moq, volume, investment, Delivery, timing, cry, Responsible, incoterms, Comments)
  81. values ('$IdRFQ','$Data', '$ProjectName',  '$ProjectPartNombre', '$Customer','$RMPartNumber', '$Description', '$Suppliers', '$Price', '$Cry2', '$MOQ', '$Volume', '$Investment', '$Delivery','$Timing', '$Cry', '$Responsible', '$Incoterms', '$Comments')";
  82. $result = mysql_query($q1)  or die ("No se pudo ejecutar la consulta");
  83.    
  84.  
  85.    if( !empty($nombre) )
  86.    {
  87.        $q1= "INSERT INTO archivos (archivo_binario, archivo_nombre, archivo_peso, archivo_tipo, IdRFQ)
  88.        values ('$binario','$nombre', '$tamano', '$tipo', (SELECT MAX(IdRFQ) FROM rfq))";
  89.        $result = mysql_query($q1)  or die ("No se pudo ejecutar la consulta");
  90.  
  91.    }
  92.  
  93.    if($q1){
  94.        $msg = "Datos cargados";
  95.    } else {
  96.        $msg = "Datos no cargados";
  97.    }
  98.  
  99.      if(mysql_query($q1,$db1)) echo 'Se ha creado correctamente';
  100.                else echo '¡¡Error en la creación!!</br>El servidor responde: '.mysql_error();
  101.                 mysql_close();
  102.            
  103.            
  104.         ?>
  105.          
  106.        
  107.        
  108.  
  109.  
  110.  
  111.            
  112.  
  113.         </center>
  114.         <p></p>
  115.         <a href="EmpFrmCreacionanterior.php">Return</a>
  116.     </body>
  117.    
  118. </html>


Ver archivo
Código HTML:
Ver original
  1. <?php
  2. if(isset($_GET['IdRFQ'])) {
  3.  
  4.    $servidor = "localhost";
  5.    $basedatos = "bd_ofertas_para_productos";
  6.    $usuario = "root";
  7.    $password = "";
  8.    $link = mysql_connect($servidor,$usuario,$password) or die('Problemas al conectar');
  9.    mysql_select_db('bd_ofertas_para_productos') or die("Error al conectar a la BD");  
  10.  
  11.    $IdRFQ = $_GET['IdRFQ'];  
  12.    $qry = "SELECT * FROM archivos WHERE IdRFQ=$IdRFQ";
  13.  
  14.   $res = mysql_query($qry) or die("Error en la consulta");
  15.  
  16.    $contenido = mysql_result($res, 0, "archivo_binario");
  17.    $tipo = mysql_result($res, 0, "archivo_tipo");
  18.    $nombre = mysql_result($res, 0, "archivo_nombre");
  19.    $peso = mysql_result($res,0,"archivo_peso");
  20.  
  21.    header("Content-type: $tipo");
  22.    header("Content-length: $peso");
  23.     header("Content-Disposition: inline; filename=$nombre");
  24.    print $contenido;
  25.  
  26.  
  27. }
  28.  
  29. ?>
  #2 (permalink)  
Antiguo 24/12/2015, 10:34
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 5 meses
Puntos: 20
Respuesta: Ver archivo PDF u otros

Hola amigo,mmm, podría ser por el nombre del archivo, si tiene caracteres raros tal vez exista problema al tratar de abrirlo,
Sin embargo, por el error q te tira, es como si el archivo estuviera dañado.
Ya probaste verificando directamente en la ruta donde subes el archivo? que peso tiene?
tu archivo original y el q esta en tu carpeta de uploads tiene el mismo peso?

Saludos
  #3 (permalink)  
Antiguo 28/12/2015, 04:21
 
Fecha de Ingreso: octubre-2015
Ubicación: Barcelona
Mensajes: 66
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Ver archivo PDF u otros

Hola german!!

Gracias por tu interés, no he podido responder antes, ya que con la navidad y tal...

Dicho eso he probado las verificaciones que me comentaste:

-Los caracteres raros no son el problema.
-He comprobado que los archivos se guraden en la tabla ARCHIVOS, lo único que no me cuadra es que no me deja abrir el archivo si lo abro des de la BBDD con el editor y lo guardo al escritorio. Por ejemplo si hago esto con un pdf me dice que el formato original del archivo no es pdf y no me deja abrir-lo.
-Mirando los pesos he llegado a la conculsión que no me deja abrir archivos más grandes de 50kB.
-El archivo original y el de la BBDD tienen el mismo peso.

Esto es lo que creo, quizás estoy equivocado. Revisando el código, no veo que en ningún lugar esté dando la orden de que el archivo sea menor de 50kB.


Gracias por vuestro tiempo!!
  #4 (permalink)  
Antiguo 28/12/2015, 06:46
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Ver archivo PDF u otros

Hola ommmm,

No sé si tendrás alguna restricción en tu aplicación que te obligue a hacerlo de la forma que lo haces, pero creo que no es una práctica recomendada guardar los archivos en la base de datos, es mejor guardar el nombre del archivo en el campo correspondiente de la base de datos y el archivo o archivos en una o varias carpetas.

No sé si te servirá la idea, pero yo lo haría así, consume menos recursos y es más fácil de manejar.
  #5 (permalink)  
Antiguo 28/12/2015, 06:56
 
Fecha de Ingreso: octubre-2015
Ubicación: Barcelona
Mensajes: 66
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Ver archivo PDF u otros

Hola rbczgz,

Gracias por tu aportación, lo que pasa es que al principio no sabía como hacer-lo y por el foro me dijeron que lo hiciese de la manera que comentas, lo probé, pero no conseguí buenos resultados, en parte porqué no sabía cómo hacer-lo bien. Entonce ayudaron facilitando-me un código para hacer-lo cómo lo hago ahora, así que me dijeron que crease una tabla nueva en la BBDD y todo eso.
No recuerdo muy bien el razonamiento, pero muchos me dijeron, que para subir sólo un pdf y no subir muchos era mejor la opción que tengo...

Así que no sé que decir-te, ahora me funciona, pero sólo con archivos más pequeños de 50kB, pero cómo mínimo me funciona y lo entiendo minimamente.

Si tienes tiempo para mirar-te mi código y mostrar-me cómo harías tu el código, te lo agradecería. Sinó gracias igualmente.
  #6 (permalink)  
Antiguo 28/12/2015, 11:22
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Ver archivo PDF u otros

Hola ommmm,

A primera vista, ya que no dispongo de mucho tiempo para analizar el código con todo detenimiento, te diría que al recuperar el archivo, te falta la extensión que, por lo que veo, tampoco la guardas al cargarlo.

Si quieres prueba eso y nos cuentas.
  #7 (permalink)  
Antiguo 29/12/2015, 05:27
 
Fecha de Ingreso: octubre-2015
Ubicación: Barcelona
Mensajes: 66
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Ver archivo PDF u otros

Gracias Rubén,

He estado buscando que debería escribir para guardar la extensión del archivo cuando lo cargo y cuando lo recupero. Pero no he sabido encontrar-lo, si podeís facilitar-me información o más o menos que debería escribir, me seria de gran ayuda.


Saludos!
  #8 (permalink)  
Antiguo 29/12/2015, 05:57
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Ver archivo PDF u otros

Hola ommmm,

Es fácil, primero debes guardar la extensión al subir el archivo, para poderla recuperar después:

Código PHP:
Ver original
  1. ......
  2.             if(!empty($_FILES['archivo']['name']))
  3.             {
  4.                 //aqui recibo el archivo
  5.                 $nombre = $_FILES['archivo']['name'];
  6.                 $tipo = $_FILES['archivo']['type'];
  7.                 $tamano = $_FILES['archivo']['size'];
  8.                 $ext = end(explode(".", $nombre));
  9.  
  10. .......

Luego, puesto que lo guardas como binario en la BD, lo mejor es que agregues un campo para la extensión y ahí guardas ese dato.

Espero que te sirva.
  #9 (permalink)  
Antiguo 02/01/2016, 17:23
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 4 meses
Puntos: 5
Respuesta: Ver archivo PDF u otros

Y un consejo: pásate a MySQLi, yo lo hice hace unos meses y un consejo: mucho más fácil con estilo por objetos que por procedimientos.
  #10 (permalink)  
Antiguo 02/01/2016, 17:43
 
Fecha de Ingreso: enero-2016
Mensajes: 14
Antigüedad: 8 años, 4 meses
Puntos: 1
Respuesta: Ver archivo PDF u otros

Yo tenía un problema similar al tuyo, lo he solucionado de esta manera espero te sirva

Código PHP:
Ver original
  1. $ruta = '../actas/'.$archivo;
  2.  
  3.         if (is_file($ruta))
  4.         {
  5.            header('Content-Type: application/force-download');
  6.            header('Content-Disposition: attachment; filename='.$archivo);
  7.            header('Content-Transfer-Encoding: binary');
  8.            header('Content-Length: '.filesize($ruta));
  9.  
  10.            readfile($ruta);
  11.         }

PD: yo prefiero guardar siempre el archivo en el servidor y la ruta en la base, los binarios te comen literalmente la base.

Saludos
  #11 (permalink)  
Antiguo 04/01/2016, 03:29
 
Fecha de Ingreso: octubre-2015
Ubicación: Barcelona
Mensajes: 66
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Ver archivo PDF u otros

Saludos y gracias a todos,

Primero gracias por la recomendación Diego, lo miraré.
También agradecer tu aporte Sebastián, me he puesto en contacto por privado.

Respecto a lo que me comentaste Rubén, lo he probado, me carga el archivo, pero no lo puedo ver,
cuando lo cargo me sale este error:
Strict Standards: Only variables should be passed by reference in C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\data\localweb\scripts\premo\nouempcrear.ph p on line 64

Te dejo el código con los cambios realizados, para que puedas ver si los he hecho bien.

Saludos a todos y muchas gracias.



Código carga

Código PHP:
Ver original
  1. $directorio = "../../subidas/";
  2. $nombre = '';
  3.             if(!empty($_FILES['archivo']['name']))
  4.             {
  5.                 //aqui recibo el archivo
  6.                 $nombre = $_FILES['archivo']['name'];
  7.                 $tipo = $_FILES['archivo']['type'];
  8.                 $tamano = $_FILES['archivo']['size'];
  9.                 $ext = end(explode(".", $nombre));  
  10.                 $fichero_subido = $directorio.$nombre;
  11.  
  12.                 $fp = fopen($_FILES['archivo']['tmp_name'], "rb");
  13.                 $binario = fread($fp, $tamano);
  14.                 $binario = addslashes($binario);
  15.                 fclose($fp);    
  16.  
  17.   if( !empty($nombre) )
  18.     {
  19.         $q1= "INSERT INTO archivos (archivo_binario, archivo_nombre, archivo_peso, archivo_tipo, archivo_ext, IdRFQ)
  20.        values ('$binario','$nombre', '$tamano', '$tipo', '$ext', (SELECT MAX(IdRFQ) FROM rfq))";
  21.         $result = mysql_query($q1)  or die ("No se pudo ejecutar la consulta");
  22.  
  23.     }


Código Descarga

Código PHP:
Ver original
  1. $qry = "SELECT * FROM archivos WHERE IdRFQ=$IdRFQ";
  2.  
  3.    $res = mysql_query($qry) or die("Error en la consulta");
  4.    
  5.     $contenido = mysql_result($res, 0, "archivo_binario");
  6.     $tipo = mysql_result($res, 0, "archivo_tipo");
  7.     $nombre = mysql_result($res, 0, "archivo_nombre");
  8.    
  9.     $ext = mysql_result($res,0,"archivo_ext");  
  10.  
  11.     header("Content-type: $tipo");
  12.     header("Content-length: $peso");
  13.      header("Content-Disposition: inline; filename=$nombre");
  14.     print $contenido;

Etiquetas: html, mysql, pdf, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:53.