Descarga de archivos con PHP

Si necesitamos compartir archivos, tenemos dos opciones; los subimos a la nube (gestores de descarga, como Google Drive, MediaFire o MEGA), o podemos permitir que lo descarguen desde nuestra web.

Aunque, como desventaja, estas descargas ocuparán ancho de banda en nuestro hosting, a mi parecer, permiten más control respecto al archivo (por ejemplo, podemos ver desde qué dispositivo se ha descargado el archivo con PHP) que los gestores de descarga. Además, podemos actualizar los archivos con una simple subida al FTP.

¿Cómo generar la descarga de un archivo?

Primero, debemos comprobar si nuestro servidor/hosting tiene instalado (y activo) PHP. Para ello, creamos un nuevo archivo llamado, por ejempo, test.php (es importante que sea un archivo con extensión .php, no puede ser test.php.html ni nada así).

En ese archivo, escribiremos lo siguiente entre las etiquetas BODY de HTML:

<?php phpinfo(); 
?>

Una vez escrito eso, debemos guardarlo (ya sabes cómo), lo subimos a nuestro hosting y visitamos esa página.

Si vemos el código escrito, nuestro servidor NO permite PHP. De lo contrario, veremos la información del PHP (la versión activa, el sistema del server, la configuración, etc.)

Si PHP no está activo en el servidor, debes instalarlo. Si no está instalado y no puedes instalarlo, puedes dejar de leer.

Código y explicaciones

Para poder permitir que alguien descargue nuestro(s) archivo(s), debemos crear un archivo PHP donde debe decir lo siguiente:

<?php
header("Content-disposition: attachment; filename=nombre_del_archivo.extension");
header("Content-type: MIME");
readfile("nombre_del_archivo.extension");
?>

A continuación explicaré las partes del código en rojo:

nombre_del_archivo.extension = Por ejemplo, mi_archivo.pdf (se entiende, ¿no?)

MIME = Multipurpose Internet Mail Extensions (o «Extensiones Multipropósito de Correo en Internet»), son, según Wikipedia, «una serie de convenciones o especificaciones dirigidas al intercambio a través de Internet de todo tipo de archivos (texto, audio, vídeo, etc.) de forma transparente para el usuario«.

Dispones de una lista de archivos y su propia extensión MIME en este enlace.

Por ejemplo, podemos ver que el MIME de un PDF es «application/pdf«, el de un ZIP es «application/zip«, el de una imagen JPG es «image/jpeg«, el de un MP3 es «audio/mpeg» y el de EXE es «application/octet-stream«.

En este caso, queremos que se descargue, por ejemplo, un PDF llamado «Hipercubo». Entonces, escribiremos lo siguiente:

<?php
header("Content-disposition: attachment; filename=Hipercubo.pdf");
header("Content-type: application/pdf");
readfile("Hipercubo.pdf");
?>

No olvides que debes definir el directorio donde está guardado el archivo, y subirlo al FTP.

Una vez hayamos definido el nombre y la extensión, guardamos el archivo como, por ejemplo, «descarga.php«, lo subimos al hosting y pasamos al siguiente paso; enlazar la descarga.

Para eso, simplemente tenemos que crear un hipervínculo que llame al archivo PHP.

<a href="descarga.php">Descargar PDF</a>

Claramente, debemos apuntar el hipervínculo a el directorio donde hemos guardado el PHP.
No es lo mismo:

<a href="descarga.php">Descargar PDF</a>

Que…

<a href="documentos/descarga.php">Descargar PDF</a>
<a href="archivos/pdf/descarga.php">Descargar PDF</a>

Ya debes saber que conocer y respetar los directorios del FTP es importante para enlazar correctamente.

Conclusión:

Un poco de PHP y un hipervínculo nos va a permitir poder descargar archivos desde nuestra web.
Recomiendo habituarse a comprimir los archivos en ZIPs, principalmente porque significa un poco menos de «consumo» de ancho de banda en el servidor.

Espero que el tutorial haya sido de utilidad. Nos leemos, ¡saludos!

28 comentarios

  1. Christian · abril 21, 2016

    Hola, cómo puedo bajar un archivo php? No soy programador. Necesito bajar un archivo php del campus virtual de UBA XXI, donde tiene ejercicios y evaluaciones de la materias con sus respuestas y explicaciones de las mismas. El campus pone a la par un archivo en pff, pero este no tiene la respuestas y las explicaciones. ¿Cómo hago para bajar archivos PHP desde Google Chorme o Internet Explorer, para poder ver los archivos php desde mi computadora sin entrar a Internet?
    Gracias, saludos!

    Me gusta

    • Rocanrol · abril 23, 2016

      Hola, Christian.

      No termino de entender qué es lo que necesitas, si bajar un archivo .php (cosa que es prácticamente imposible, porque PHP funciona del lado del servidor) o bajar un PDF (no conozco los .pff, así que supongo que quieres decir .pdf).

      Te insto a que expliques más detalladamente tu necesidad.

      De todas formas, este blog está creado para ayudar a gente relacionada con el mundo de la programación web y la informática. Mi recomendación es que contactes con la gente de UBA XXI para solucionarlo.

      Saludos.

      Me gusta

  2. Christian Antoriano · abril 25, 2016

    Hola, gracias por responder
    Quiero bajar archivos php de la página de UBA XXI o desde cualquier página.
    Se puede hacer?
    Saludos

    Me gusta

    • Rocanrol · abril 25, 2016

      Los archivos «.php» generalmente no son descargables, por cuestiones de seguridad.

      Me gusta

  3. Carlos · abril 27, 2016

    Hola, tengo una duda!
    hice todo tal y como hiciste tu, pero a la hora de descargar el archivo, cuando lo voy abrir el archivo sale da?ado, sabes porque pasa esto?

    Me gusta

    • Rocanrol · abril 30, 2016

      ¿Especificaste el tipo de MIME correcto?

      Me gusta

      • Youyou · marzo 3, 2017

        A mí me ocurre lo mismo y he especificado el tipo MIME correcto
        Saludos

        Me gusta

      • Rocanrol · marzo 3, 2017

        ¿Qué archivo y MIME estás usando?

        Me gusta

      • Youyou · marzo 3, 2017

        También he de decir que el archivo php para descarga quiero que esté en un directorio distinto del archivo que quiero descargar, ¿sería posible esto?

        Me gusta

      • Rocanrol · marzo 3, 2017

        Sí, solo hay que cambiar las rutas.

        Me gusta

      • Youyou · marzo 6, 2017

        Vale, a base de probar, he averiguado cómo se lee de otra ruta distinta.
        Yo tengo el archivo en el directorio actual, es decir, el directorio «punto» → ./
        La imagen que quiero leer está en un directorio llamado «1/» dentro de este directorio
        Yo ponía «readfile(/1/IMG.JPG)».
        Y hay que poner «readfile(./1/IMG.JPG)»
        Por si a alguien le sirve

        Me gusta

    • Youyou · marzo 6, 2017

      Hola de nuevo, estaba utilizando el tipo MIME jpeg, es decir puse image/jpeg para descargar un archivo en formato .JPG
      Lo de cambiar las rutas no sé exactamente cómo quieres decir, ya que lo he intentado cambiando solamente después de «filename», solamente en «readfile()» y cambiando la ruta en ambos y sigue sin funcionarme.
      Me vendría bien que me dejaras un ejemplo
      Muchas gracias

      Me gusta

  4. Mauricio · octubre 11, 2016

    Que tal amigo el código es muy sencillo y me sirvió, pero tengo duda y si quiero descargar mas archivos que tengo en mi FTP tendría que ser un archivo php para cada archivo que se descargara?

    Agradecería una respuesta saludos…

    Me gusta

    • Rocanrol · octubre 11, 2016

      Hola;

      Lo que podías hacer es un `select` de HTML donde estén listados los archivos que se puedan/quieran descargar, y tras seleccionarlo enviar una petición AJAX a PHP para que, después de sanitizar todo el contenido para evitar inyecciones de código, compruebe si ese archivo existe. Y si así fuese, que lo descargue.

      ¿Se entiende?

      Saludos.

      Me gusta

  5. Isma Perez · diciembre 20, 2016

    Muy buena nota, me ha servido para colgar en mi web una aplicacion android y descargarla de manera sencilla. Gracias!

    Me gusta

    • Rocanrol · diciembre 21, 2016

      Gracias por tu comentario 😀

      Me gusta

  6. Hernando · marzo 30, 2017

    Muy bueno tu aporte, pero tengo un inconveniente, descargo el archivo pero necesito que se re direccione a otra pagina, pero no lo hace, me podrías hechar una mano con eso.

    Gracias.

    Me gusta

    • Rocanrol · marzo 31, 2017

      ¿Cómo que no lo hace? ¿Qué código estás usando?

      Me gusta

  7. Brekaz · julio 12, 2017

    hola men. sabes como filtrar el acceso al archivo. (mas especifico un pdf) para que solo personas logueadas accedan a el y que no cualquiera lo pueda hacer mediante la url?

    Me gusta

    • Rocanrol · julio 12, 2017

      Hola. Sin tener que crear un sistema de usuarios, permisos, etc. lo más sencillo sería con htpasswd (si es que usas Apache).

      Me gusta

  8. savapunk · julio 17, 2017

    No se si se publicó mi comentario por eso te vuelvo a preguntar.
    Ingreso a mysql php panel admin, ahí cargo el archivo pdf que deseo, con su extensión correspondiente y mi consulta concreta es, debo crear todo ese código que muestras tú e hipervincularlo al botón que coloqué en mi web para la correspondiente descarga? O bien el panel mysql php lo hace de manera automática cuando cargo mi archivo en mi servidor?.
    Gracias!

    Me gusta

  9. Mario · julio 19, 2017

    Hola, tengo la siguiente duda: necesito pasarle al script php el nombre del archivo en una variable o parámetro para que funcione dinamicamente y no solamente baje el archivo previamente definido en el script. Probé con ajax, pero ajax te te devuelve por pantalla el resultado del script y no baja el archivo.
    Muchas gracias de antemano

    Me gusta

  10. oscar · noviembre 17, 2017

    Gracias!!!, lo use con un txt y funcionó la descarga

    Me gusta

  11. Chijete · diciembre 13, 2017

    Excelente articulo.
    Me sirvio de mucha ayuda, Gracias

    Me gusta

  12. Sebastián · diciembre 15, 2017

    Hola amigo muy buen artículo gracias, una duda que debo poner en el mime si no quiero un tipo de archivo en específico ya que puede que a veces el archivo esa PDF o imagen

    Me gusta

    • Rocanrol · diciembre 15, 2017

      En ese caso tendrías que manejar la lógica antes de poner el archivo a descargar. Es decir, comprobar si va a ser PDF o imagen y entonces dar la instrucción para que descargue ese tipo de archivo.

      Me gusta

  13. Mario Luhmann · enero 30, 2018

    Tu código es vulnerable, si alguien utiliza ese código estará expuestos a descargas arbitrarias de archivos dentro de su servidor.

    Me gusta

    • Rocanrol · enero 30, 2018

      Correcto, lo es. Pero si alguien copia de un tutorial y lo pega sin importarle nada, es selección natural.

      Me gusta

Deja un comentario