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!

Anuncios

18 comments

  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

      ¿Especificaste el tipo de MIME correcto?

      Me gusta

      • Youyou · marzo 3

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

        Me gusta

      • Rocanrol · marzo 3

        ¿Qué archivo y MIME estás usando?

        Me gusta

      • Youyou · marzo 3

        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

        Sí, solo hay que cambiar las rutas.

        Me gusta

      • Youyou · marzo 6

        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

      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

    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

      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

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

    Me gusta

  6. Hernando · 30 Days Ago

    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 · 29 Days Ago

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

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s