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!
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Los archivos «.php» generalmente no son descargables, por cuestiones de seguridad.
Me gustaMe gusta
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 gustaMe gusta
¿Especificaste el tipo de MIME correcto?
Me gustaMe gusta
A mí me ocurre lo mismo y he especificado el tipo MIME correcto
Saludos
Me gustaMe gusta
¿Qué archivo y MIME estás usando?
Me gustaMe gusta
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 gustaMe gusta
Sí, solo hay que cambiar las rutas.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Muy buena nota, me ha servido para colgar en mi web una aplicacion android y descargarla de manera sencilla. Gracias!
Me gustaMe gusta
Gracias por tu comentario 😀
Me gustaMe gusta
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 gustaMe gusta
¿Cómo que no lo hace? ¿Qué código estás usando?
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Gracias!!!, lo use con un txt y funcionó la descarga
Me gustaMe gusta
Excelente articulo.
Me sirvio de mucha ayuda, Gracias
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Tu código es vulnerable, si alguien utiliza ese código estará expuestos a descargas arbitrarias de archivos dentro de su servidor.
Me gustaMe gusta
Correcto, lo es. Pero si alguien copia de un tutorial y lo pega sin importarle nada, es selección natural.
Me gustaMe gusta