Granalcir | La Informacion Como Concepto Objetivo

Tecnologia e Informacion

Categories




  • Descarga de archivos con php
  • Posted: webmaster on June 27th, 2007 | Programacion PHP

    Muchas veces queremos permitir que nuestros usuarios descarguen un archivo sin que éste sea visualizado en el navegador; como es el caso de los archivos .doc o .pdf. De esta manera, nuestros usuarios van a poder descargarlo para luego verlos en la aplicación correspondiente.

    Este código que pongo a continuación está extraído de php.net:

    Código:

        $f $_GET[“f”];
    Â Â Â Â
    header(“Content-type:Â application/octet-stream”);
    Â Â Â Â
    header(“Content-Disposition:Â attachment;Â filename=\”$f\”\n”);
    Â Â Â Â
    $fp=fopen(“$f”“r”);
    Â Â Â Â
    fpassthru($fp);
    ?>

    Para quer esto funcione, tendriamos que hacer referencia a la siguiente dirección en el navegador:
    www.misitio.com/descargar.php?f=algo.doc

    Esta acá está todo muy fácil y bonito, pero ¿qué pasa si un usuario avanzado pone ?f=index.php? Si si, puede descargar TODO.

    Para solucionar esto, podemos pasar valores de ID por get, los cuales estarían almacenados en una base de datos.

    Supongamos que tenemos una tabla llamada ‘archivos’, podemos tener 3 campos: id, archivo, descargas. Con un simple formulario podemos insertar todos los archivos que tenemos para descargar. Tenemos insertado el registro Nº1 con el archivo ‘texto.doc’ con 0 descargas (predeterminado en el campo de la tabla). Lo que hacemos ahora, en el enlace que ponemos para que nuestros usuarios desacarguen los archivos, es poner lo siguiente: descargar.php?f=1 y listo.

    Ahora tenemos que modificar el archivo ‘descargar.php’ para que esto funcione. En el ejemplo, tenemos almacenados nuestros archivos en la carpeta ‘archivos’.

    Código:

    $id $_GET[‘id’];
    if (
    $id == “”) { echo “ERROR: Debes seleccionar la descarga”;exit; }
    $linkmysql_connect(“localhost”“usuario”“password”) or die (“No se puede conectar con la DB.”);

    mysql_select_db(“base_de_datos”,$link) or die(“Error seleccionando la base de datos.”);

    $sql “SELECT archivo FROM archivos WHERE id = $id”;
    $result mysql_query($sql);
    while (
    $row mysql_fetch_array($result))

    $f$row[‘archivo’];
    if (
    $f== “”){echo “ERROR: No se encontro el archivo”;exit; }

    $descarga “archivos/”.$f;

    Â Â Â header(“Content-type:Â application/octet-stream”);
    Â Â Â
    header(“Content-Disposition:Â attachment;Â filename=”.$f.“\n\n”);
    Â Â Â
    $fp=fopen(“$descarga”“r”);
    Â Â Â
    fpassthru($fp);

    ?>

    Noten que tiene protecciones para cuando el GET esta vacio (descargar.php o descargar.php?id= ) y para cuando el registro no se encuentra en la base de datos.

    Lo ideal sería aplicar un juego de registros en vez de la conexión “manual” que puse yo acá. Pueden seleccionar el nombre del archivo y la cantidad de descargas desde la base de datos, y al finalizar el scrip se hace un update sumando 1 a la cantidad de descargas.

    Espero que os disfruten el script…

    2 Comments

    coments | comments rss | trackback uri

    Articulos Relacionados:

    2 Comments so far

    1. Blader4Life on April 6, 2008 10:44 am

      It’s funny how people believe everything that is written in Internet. But it’s their own business, I don’t care about them. My opinion is that it’s such a bullshit!

    2. crazyman7 on April 9, 2008 5:06 am

      I think that people should communicate, no matter where they do it – in real life or in Internet.

    Name (required)

    Email (required)

    Website

    Speak

    Nuevos Post

    Search

    Post Recientes

    Archives

    Site Details

    This part could be utilised for showing ads and other stuff

    Blogroll