Manejo de archivos con PHP y MySQL

1,980 views

Este Howto es acerca de como subir archivos atravez de PHP y guardarlos en MySQL asi como la extracción del archivo de MySQL atravez de PHP.

Requisitos:

  • Tener instalado PHP y MySQL.
  • Conocimientos basicos de PHP y MySQL.

Muchas veces necesitamos darle a los usuarios la facilidad de poder "subir" o guardar archivos en una base de datos y n es tan dificil como aparenta asi que comenzemos...

Primeramente necesitamos el diseño de la tabla

Imagen diseño de tabla para subir archivos con PHP y MySQL

y el script para crear la tabla es:

MySQL:
  1. CREATE TABLE tbl_documentos (
  2.   id_documento INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   titulo VARCHAR(150) NULL,
  4.   descripcion MEDIUMTEXT NULL,
  5.   contenido LONGBLOB NULL,
  6.   tamanio INTEGER UNSIGNED NULL,
  7.   tipo VARCHAR(150) NULL,
  8.   nombre_archivo VARCHAR(255) NULL,
  9.   tamanio_unidad VARCHAR(150) NULL,
  10.   PRIMARY KEY(id_documento)
  11. );

Explico un poco cada campo para darnos una mayor idea:

  • id_documento es el identificador o llave primaria
  • titulo contiene titulo para el documento
  • descripción contiene la descripcion del documento
  • contenido en este campo en donde se guardara nuestro documento
  • tamamio en este campo guardamos el tamaño del documento
  • tipo contendra el tipo MIME del documento
  • nombre_archivo contendra el nombre del documento
  • tamanio_unidad en este campo registraremos si la medida esta em kb,MB,GB

Ahora necesitamos un formulario
Aqui esta el codigo del archivo form.html:

HTML:
  1. <form id="test_upload" name="test_upload" action="upload.php" enctype="multipart/form-data" method="post">
  2.     <table border="0" cellpadding="0" cellspacing="0">
  3.         <tr>
  4.             <td>
  5.                 Titulo
  6.             </td>
  7.             <td>
  8.                 <input type="text" id="titulo" name="titulo"/>
  9.             </td>
  10.         </tr>
  11.         <tr>
  12.             <td colspan="2">
  13.                 Descripcion
  14.             </td>
  15.         </tr>
  16.         <tr>
  17.             <td colspan="2">
  18.                 <textarea id="descripcion" name="descripcion" cols="50" rows="5"></textarea>
  19.             </td>
  20.         </tr>
  21.         <tr>
  22.             <td colspan="2">
  23.                 Archivo <input type="file" id="archivo" name="archivo"/>
  24.             </td>
  25.         </tr>
  26.         <tr>
  27.             <td colspan="2">
  28.                 <input type="submit" value="Registrar Documento"/>
  29.             </td>
  30.         </tr>
  31.     </table>
  32. </form>

Al formulario debemos como todos debe tener sus atributos
action que indica el archivo que sse encargara de procesar la información que le enviemos
y method que indica si los datos seran enviados por POST o GET para envio de archivos es obligatorio marcarlo como POST
adicinal a estos atributos debemos especificar enctype con el valor multipart/form-data para que se pueda realizar el envio.
Y aqui esta el codigo del archivo upload.php

PHP:
  1. <?php
  2. //ESTA FUNCION LA USAREMOS PARA OBTENER EL TAMAÑO DE NUESTRO ARCHIVO
  3. function filesize_format($bytes, $format = '', $force = ''){
  4.     $bytes=(float)$bytes;
  5.     if ($bytes<1024){
  6.         $numero=number_format($bytes, 0, '.', ',');
  7.         return array($numero,"B");
  8.     }
  9.     if ($bytes<1048576){
  10.         $numero=number_format($bytes/1024, 2, '.', ',');
  11.         return array($numero,"KBs");
  12.     }
  13.     if ($bytes>= 1048576){
  14.         $numero=number_format($bytes/1048576, 2, '.', ',');
  15.         return array($numero,"MB");
  16.     }
  17. }
  18. //VERIFICAMOS QUE SE SELECCIONO ALGUN ARCHIVO
  19. if(sizeof($_FILES)==0){
  20.     echo "No se puede subir el archivo";
  21.     exit();
  22. }
  23. // EN ESTA VARIABLE ALMACENAMOS EL NOMBRE TEMPORAL QU SE LE ASIGNO ESTE NOMBRE ES GENERADO POR EL SERVIDOR
  24. // ASI QUE SI NUESTRO ARCHIVO SE LLAMA foto.jpg el tmp_name no sera foto.jpg sino un nombre como SI12349712983.tmp por decir un ejemplo
  25. $archivo = $_FILES["archivo"]["tmp_name"];
  26. //Definimos un array para almacenar el tamaño del archivo
  27. $tamanio=array();
  28. //OBTENEMOS EL TAMAÑO DEL ARCHIVO
  29. $tamanio = $_FILES["archivo"]["size"];
  30. //OBTENEMOS EL TIPO MIME DEL ARCHIVO
  31. $tipo = $_FILES["archivo"]["type"];
  32. //OBTENEMOS EL NOMBRE REAL DEL ARCHIVO AQUI SI SERIA foto.jpg
  33. $nombre_archivo = $_FILES["archivo"]["name"];
  34. //PARA HACERNOS LA VIDA MAS FACIL EXTRAEMOS LOS DATOS DEL REQUEST
  35. extract($_REQUEST);
  36. //VERIFICAMOS DE NUEVO QUE SE SELECCIONO ALGUN ARCHIVO
  37. if ( $archivo != "none" ){
  38.     //ABRIMOS EL ARCHIVO EN MODO SOLO LECTURA
  39.     // VERIFICAMOS EL TAÑANO DEL ARCHIVO
  40.     $fp = fopen($archivo, "rb");
  41.     //LEEMOS EL CONTENIDO DEL ARCHIVO
  42.     $contenido = fread($fp, $tamanio);
  43.     //CON LA FUNCION addslashes AGREGAMOS UN \ A CADA COMILLA SIMPLE ' PORQUE DE OTRA MANERA
  44.     //NOS MARCARIA ERROR A LA HORA DE REALIZAR EL INSERT EN NUESTRA TABLA
  45.     $contenido = addslashes($contenido);
  46.     //CERRAMOS EL ARCHIVO
  47.     fclose($fp);
  48.     // VERIFICAMOS EL TAÑANO DEL ARCHIVO
  49.     if ($tamanio &lt;1048576){
  50.         //HACEMOS LA CONVERSION PARA PODER GUARDAR SI EL TAMAÑO ESTA EN b ó MB
  51.         $tamanio=filesize_format($tamanio);
  52.     }
  53.    
  54.     //CREAMOS NUESTRO INSERT
  55.     $qry = "INSERT INTO tbl_documentos ( titulo,nombre_archivo, descripcion, contenido, tamanio,tamanio_unidad, tipo ) VALUES
  56.     ('$titulo','$nombre_archivo', '$descripcion','$contenido','{$tamanio[0]}','{$tamanio[1]}', '$tipo')";
  57.    
  58.     //NOS CONECAMOS A LA BASE DE DATOS
  59.     //REMPLAZEN SUS VALOS POR LOS MIOS
  60.     mysql_connect("localhost","root","12345") or die("No se pudo conectar a la base de datos");
  61.    
  62.     //SELECCIONAMOS LA BASE DE DATOS CON LA CUAL VAMOS A TRABAJAR CAMBIEN EL VALOR POR LA SUYA
  63.     mysql_select_db("test");
  64.    
  65.     //EJECUTAMOS LA CONSULTA
  66.     mysql_query($qry) or die("Query: $qry <br />Error: ".mysql_error());
  67.    
  68.     //CERRAMOS LA CONEXION
  69.     mysql_close();
  70.     //NOTIFICAMOS AL USUARIO QUE EL ARCHVO SE HA ENVIADO O REDIRIGIMOS A OTRO LADO ETC.
  71.     echo "Archivo Agregado Correctamente<br />";
  72.     echo '<a href="form.html">Subir Otro Archivo</a><br /> ';
  73. }else{
  74.     echo "No fue posible subir el archivo";
  75.     echo '<a href="form.html">Subir Otro Archivo</a><br /> ';
  76. }
  77. ?>

Ahora que ya tenemos nuestro script funcionando y podemos hacer los uploads que queramos vamos
hacer que se puedan explorar y descargar o mostrar en caso de que sea una imagen.
Primero creamos un archivo que nos imprima el contenido del documento y el tipo del mismo para poder renderizarlo
con este archivo que llamaremos getfile.php

PHP:
  1. <?php
  2. //NOS CONECAMOS A LA BASE DE DATOS
  3. //REMPLAZEN SUS VALOS POR LOS MIOS
  4. mysql_connect("localhost","root","12345") or die("No se pudo conectar a la base de datos");
  5.  
  6. //SELECCIONAMOS LA BASE DE DATOS CON LA CUAL VAMOS A TRABAJAR CAMBIEN EL VALOR POR LA SUYA
  7.  
  8. //CONSTRUIMOS LA CONSULTA PARA OBTENER EL DOCUMENTO
  9. $qry="Select * from tbl_documentos where id_documento={$_REQUEST['id_documento']}";
  10. $res=mysql_query($qry) or die(mysql_error()." qry::$qry");
  11. $obj=mysql_fetch_object($res);   
  12.  
  13. //OBTENEMOS EL TIPO MIME DEL ARCHIVO ASI EL NAVEGADOR SABRA DE QUE SE TRATA
  14. header("Content-type: {$obj->tipo}");
  15.  
  16. //OBTENEMOS EL NOMBRE DEL ARCHIVO POR SI LO QUE SE REQUIERE ES DESCARGARLO
  17. header('Content-Disposition: attachment; filename="'.$obj->nombre_archivo.'"');
  18.  
  19. //Y PO ULTIMO SIMPLEMENTE IMPRIMIMOS EL CONTENIDO DEL ARCHIVO
  20. print $obj->contenido;
  21.  
  22. //CERRAMOS LA CONEXION
  23. ?>

Posteriormente crearemos un archivo para que nos liste los documentos registrados y
detecte si es una imagen en este caso imprimiremos un tag img y su src sera nuestro archivo getfile.php
cuando incluimos un archivo con php podemos pasarle parametros cono si se tratara de un query string del browser asi que le pasaremos el id_documento
para que nos muestre el archivo solicitado.
Este es e código de nuestro archivo list.php

PHP:
  1. <?php
  2. //NOS CONECAMOS A LA BASE DE DATOS
  3. //REMPLAZEN SUS VALOS POR LOS MIOS
  4. mysql_connect("localhost","root","12345") or die("No se pudo conectar a la base de datos");
  5.  
  6. //SELECCIONAMOS LA BASE DE DATOS CON LA CUAL VAMOS A TRABAJAR CAMBIEN EL VALOR POR LA SUYA
  7.  
  8. //CONSTRUIMOS EL QUERY PARA OBTENER LOS ARCHIVOS
  9. $qry="select
  10.         docs.*,
  11.         CASE docs.tipo
  12.             WHEN 'image/png' then
  13.                 'image'
  14.             WHEN 'image/jpg' then
  15.                 'image'
  16.             WHEN 'image/gif' then
  17.                 'image'
  18.             WHEN 'image/jpeg' then
  19.                 'image'
  20.             ELSE
  21.                 'file'
  22.         END as display
  23.     from tbl_documentos AS docs";
  24.  
  25. //EJECUTAMOS LA CONSULTA
  26. $res=mysql_query($qry) or die("Query: $qry ".mysql_error());
  27.  
  28. //RECORREMOS LA CONSULTA
  29. //*********NOTA DONDE DICE alt='$obj-/>titulo' QUITA LA BARRA PARA QUE QUEDE ASI:
  30. // alt='$obj->titulo'
  31. // EL WORDPRESS ME ESTA REMPLAZANDO EL CODIGO
  32.  
  33. while ($obj=mysql_fetch_object($res)) {
  34.     //SI EL TIPO DE DOCUMENTO ES UMAGEN LA MOSTRAMOS SI NO SOLO HACEMOS EL LINK
  35.     switch ($obj->display){
  36.         case "image":
  37.             echo "<div>
  38.                     <a href='getfile.php?id_documento={$obj->id_documento}'>
  39.                         <img alt='$obj-/>titulo' src='getfile.php?id_documento={$obj->id_documento}'/>
  40.                     </a>
  41.                 </div><hr />";
  42.             break;
  43.         case "file":
  44.             echo "<div>
  45.                     <a href='getfile.php?id_documento={$obj->id_documento}'>$obj->titulo</a>
  46.                 </div><hr />";
  47.             break;     
  48.     }
  49.    
  50. }
  51.  
  52. //CERRAMOS LA CONEXION
  53. ?>

Ahora solo abrimos nuestro explorador con loas sigueintes direcciones:

  • http://url_deprueba/form.html -> Veremos nuestro formulario de subida
  • http://url_deprueba/list.php -> Veremos el listado de nuestros documentos

Descargar los archivos del howto de este Archivo de howto upload
Y con esto terminamos este pequeño howto de como manejar archivos con php y MySQL
espero les sirva y cualquier comentario queja o sugerencia porfavor haganla saber asi como alguna duda que tengan y se pueda convertir en un howto
sera tomada en cuenta.
Cudense ...

Si te gusto este post y te sientes dadivoso,Invitame un cafe



Este articulo lo escribí el dia 08, 08, 2007 a las 4:33 pm y lo tengo guardadito en
Bases de datos, Linux, PHP, Programación.
Puedes checar comentarios nuevos de este articulo suscribiendote con este link RSS 2.0 .
Tus comentarios son importantes Deja tu comentario, o trackback desde tu sitio.

19 Respuestas to “Manejo de archivos con PHP y MySQL”

  1. dulce
    desde Mexico Dijo:

    hola, tengo un codigo similar a este, al borrar tengo un problema ya no puedo agregar mas, lo borro con un simple delete si no con que mas ??

    muchas gracias :D

    [Responder]

  2. Ruben Omar
    desde Mexico Dijo:

    Hola gracias por comentar...
    Como estas borrando las filas? yo lo hago con un simple :

    PHP:
    1. $strSQLBorrar="DELETE FORM documentos where id_documento=$id_doc";
    2. mysql_query($strSQLBorrar);

    [Responder]

  3. Pablo [masTecno]
    desde Argentina Dijo:

    Muy inytersantel; esta como para archivar :)

    [Responder]

  4. cecilia
    desde Chile Dijo:

    Parse error: syntax error, unexpected ';' in D:\servidor\web\test\upload.php on line 5

    ilinea 5 : if ($bytes <1024){

    [Responder]

  5. Ruben Omar
    desde Mexico Dijo:

    Ups perdon fue un fallo del coloreador de sintaxis checalo nuevamente porfavor

    [Responder]

  6. frehd
    desde Spain Dijo:

    Hola queria saber cual es el tamaño maximo permitido para cada archivo.
    Soy nuevo en esto de la programacion y la verdad que te agradezco por compartir tus conocimientos. :-)

    [Responder]

  7. Ruben Omar
    desde Mexico Dijo:

    frehd:

    Gracias por el comentario mira acabo de escribir un pequeño articulo echale un vistazo:

    http://blog.deliriumlabs.net/2008/03/20/php-snippet-max-upload-file-size/

    [Responder]

  8. voodoo
    desde Argentina Dijo:

    Hola:
    tu articulo esta muy bien explicado.
    Hace un tiempo puse en mi blog un articulo sobre este tema
    http://fabianperez.blogspot.com/2007/11/php-y-mysql-manejo-de-bases-de-datos.html
    pero debo decir que tu explicacion es muy clara. Ademas noto que tienes gran conocimiento del tema y que respondes a los comentarios para ayudar.
    Felicitaciones

    [Responder]

  9. Ruben Omar
    desde Mexico Dijo:

    1000 gracias por los comentarios :D, que al fin estamos para ayudarnos entre todos

    [Responder]

  10. bettencourt
    desde Spain Dijo:

    Buenas viendo este ejemplo me gustaría preguntarte algo para saber si es posible realizarlo en php, veo que aquí archivas un documento en php, ves su tamaño y lo visionas en caso de que sea una foto, podrias visionarlo si fuera un documento y luego de alguna forma guardarlo en un array de strings para poder realizar busquedas sobre ese documento?, gracias por adelantado.

    [Responder]

  11. Ruben Omar
    desde Mexico Dijo:

    A que te refieres con visionarlo?
    Obtener el contenido?

    [Responder]

  12. Titux
    desde Mexico Dijo:

    Que tal, primero que nada, quisiera saber que quieres decir con VISIONAR, despúes, que es lo que quieres hacer en general.

    Saludos...

    [Responder]

  13. bettencourt
    desde Spain Dijo:

    el visionar o no realmente me da lo mismo, lo ke intento es poder meter el contenido de un documento de texto, en un array de strings, de forma que pueda realizar busquedas sobre ese documento

    [Responder]

    Ruben Omar April 30, 2008 12:52 pm

    Ruben Omar desde Mexico Dijo:

    Ok dejame ver si ya entendi el procedimiento que quieres es asi:

    1.- Subir un archivo de texto solo podra ser con un .TXT.
    2.- Leer el contenido del archivo y guardarlo en el campo de una tabla.
    3.- Guardar el archivo en binario.

    Ya con esto se podra hacer un formulario de busqueda para para que muetre una lista de los archivos que muetren el criterio de busqueda.

    Es esto lo que quieres hacer?
    Corrigeme si me equivoco.

    [Responder]

  14. bettencourt
    desde Spain Dijo:

    es mas o menos eso si lo ke no entiendo por ke los guardaras en binario y una pekeña apreciacion los criteriios de busqueda se los dare yo, no seran por formulario debe ser totalmente automatico y mostrara el texto que viene detras de la palabra ke anda buscando, pero si es eso ke tu dices, no te ekivocas, lo ves posible de hacer? podrias guiarme para dar esos primeros 3 pasos?, gracias de antemano, bye

    [Responder]

  15. Ruben Omar
    desde Mexico Dijo:

    OK. claro que es posible, el proximo viernes públicare el articulo enfocado exactamente en este procedimeinto.

    Saludos

    [Responder]

  16. Ruben Omar
    desde Mexico Dijo:

    Otra cosa tendras algun archivo de texto de ejemplo que me puedas proporcionar?

    [Responder]

  17. bettencourt
    desde Spain Dijo:

    Joder, no sabes cuanto te lo agradeceria si lo pudieras hacer me un grandisimo favor, supongo ke si ke te puedo pasar algo ke te sirva como ayuda, pero por donde te lo paso?

    [Responder]

  18. Ruben Omar
    desde Mexico Dijo:

    Enviamelo a mi direccion de correo: deliriumlabs@deliriumlabs.net

    [Responder]

Responder