Forzar la descarga de ficheros desde PHP

Recientemente me han pedido que añada en una de las webs que administro un enlace (de manera artesanal) para poder descargar un documento concreto.

Bien… la mayoría pensaréis que es algo trivial, porque seguramente uso alguno de los múltiples cms que existen en el mercado (y no os equivocáis), que seguro implementa de core o mediante algún sencillo plugin… Y es totalmente cierto. Pero, como os planteaba en la primera línea, me lo han pedido de forma “artesanal”.

En fin, no le demos mas vueltas, porque no tiene mucho sentido.

Sin más preámbulos, os dejo un código escrito en php que hará las delicias de los mas necesitados.

<?php
    // accepted file extensions
    $extensions = array("pdf","mp3","zip","rar");

    // file name to download
    $file = $_GET["file"];

    // file size
    $size = filesize($file);

    // Prevent go throught directories
    if(strpos($file,"/")!==false){
        die("Permission denied to change directory, please, especify only a file name");
    }

    // test the file estension
    $ftmp = explode(".",$file);
    $fExt = strtolower($ftmp[count($ftmp)-1]);
    if(!in_array($fExt,$extensions)){
        die("ERROR: File extension not recognized: $fExt");
    }

    // if it was ok, let's download it
    header("Content-Transfer-Encoding: binary");    
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Length: $size");
    $fp=fopen("$file", "r");
    fpassthru($fp);
?>

Expliquemos un poco las líneas mas importantes

  • 3 : definimos un array de extensiones de fichero aceptadas (en este caso, pdf, mp3, zip, rar…)
  • 6 : obtenemos de la request (query string) el nombre del fichero a descargar, mediante el parámetro file
  • 9 : validamos el parámetro, y no permitimos que se especifiquen nombres de fichero que contengan cambios de directorio, para prevenir descargas no deseadas (si encontramos una / terminamos con un error)
  • 14 : extraemos la extensión del fichero solicitado
  • 15 : eliminamos el . de la extensión y lo convertimos a minúsculas, para asemejarlo al array de aceptados
  • 16 : comprobamos que la extensión existe en el array de extensiones aceptadas, y en caso contrario, finalizamos con un mensaje de error adecuado
  • 21 : modificamos la cabecera de respuesta html para indicar que contiene un binario
  • 22 : añadimos a la cabecera html el nombre del fichero a descargar
  • 23 : abrimos el fichero como lectura (aquí es donde podemos comprobar que el fichero debe estar en la ruta actual en la que se encuentra esta misma página php, aunque si deseais cambiar el directorio de almacenamiento de los ficheros, es tan fácil como añadir la ruta delante del $file
  • 24 : se escribe el fichero en la response de la página

Como véis, el procedimiento es muy sencillo:

  • Subid vuestro fichero al directorio desde dónde descargaréis los ficheros
  • Subid vuestro código al directorio desde dónde descargaréis los ficheros (este es el caso sencillo, pero como os he explicado sobre la línea 23, la ruta podría variarse sin problemas)
  • Añadid un link a vuestra imagen o texto de descarga, (supongamos que yo tengo el tinglado montado en /files)  del tipo: /files/download.php?file=nombre_fichero

Y ya lo tenéis.

Fácil, ¿verdad?

Espero haberos sido de ayuda!

Jordi

Share Button

Nueva sección de fotografías: Lugares abandonados

Buenas noches,

Acabo de publicar una nueva página dentro de mi sección de fotografía: Lugares abandonados.

Y para inaugurarla, os dejo una pequeña selección de fotos de la Torre Salvana, un pequeño castillo, con mucha historia, ubicado en la Colonia Güell, en Santa Coloma de Cervelló (Baix Llobregat, Barcelona).

Espero que la encontréis interesante.

Jordi

Share Button

REISUB, cómo reiniciar tu Linux de forma “amistosa”

Seguramente, aquellos que trabajáis a menudo con Linux, os habéis quedado en alguna ocasión a medias con algún trabajo, cuando el pc, sin explicación alguna, se cuelga. A mi me solía pasar bastante en el pc del trabajo cuando se activaba el protector de pantalla…

Pues bien, entre otras, existe una secuencia de teclas, o llamada a sistema, que nos puede ayudar con este tedioso problema. Bueno, al menos, en algunas ocasiones.

La secuencia de teclas, REISUB (algunos la llaman, REIniciate SUBnormal…) es la encargada de indicarle al sistema operativo una serie de comandos que debe realizar para que se apague y se reinicie de una manera amistosa o graciosa (en Inglés, gracefully).

Para llevarla a cabo, debemos apretar las siguientes teclas en este orden, y sin soltar las dos primeras:

Alt + Impr Pant + R E I S U B

¿Qué significa cada letra?

  • R : otorga al teclado el control del sistema (Raw)
  • E : manda un sign term a todos los procesos para que finalicen de forma amistosa (End)
  • I : indica a los procesos que deben finalizar de manera  inmediata, sign kill (Inmediate)
  • S : sincroniza el sistema de ficheros para que no se pierda información al apagar (Sync)
  • U : desmonta el sistema de ficheros y todas las unidades y discos duros (Umount)
  • B : reinicia el sistema (reBoot). También podemos hacer uso de la tecla O, para indicar que se apague en vez de reiniciarse (Off)

Esta secuencia debe realizarse de manera seguida, sin pausa. Tras ello, el sistema debería reaccionar, apagándose o reiniciandose de manera controlada, por lo que al volver a arrancar habremos corrido menos riesgos de pérdida de datos.

Espero haberos ayudado!

Jordi

Share Button

Manual para la Raspberry Pi

Empiezo mi primer post sobre la famosa Raspberry Pi anunciando algo bastante interesante para los poseedores de este micro-ordenador: la publicación de un manual de tipo “educacional” por parte del equipo de CAS:

CAS RaspberryPI Educational Manual

 

Se trata, definitivamente, del esperado manual de editado por unos profesores del Computing at School (CAS) y publicado con licencia Creative Commons.

Con este manual muchos de nosotros podremos, por fin, adentrarnos un poco mas en el increíble mundo de este mini computador y exprimirlo al máximo.

Podéis accer a él desde esta url.

Si lo habéis usado, o estáis en ello, comentad qué os parece!

Jordi

Share Button

Ya tengo mi Raspberry Pi

Pues si.. Finalmente ya tengo mi Raspberry Pi!!!

Me llevé una grata sorpresa el pasado 31 de diciembre de 2012 (el último día del año!!!), cuando me proclamé como ganador de una flamante Raspberry Pi que sorteaba la página de Juan Mol, RSPPI, con motivo de su post número 50.

50 posts de RSPPI

50 posts de RSPPI

El sorteo se llevó a cabo junto con la página http://raspipc.es, web española que se dedica a la venta de kits y accesorios de la pequeña placa.

Este es el vídeo que lo certifica (también podéis visitar su post):

 

Y aquí os dejo una foto de la preciada plaquita, se trata de la versión de 512Mb:

 

Desde jormc.es quiero dar las gracias a Juan Mol y a su web RSPPI, por este gran sorteo, y cómo no, a raspipc.es por haberlo hecho posible. Prometo hacer un buen uso de él, y que pronto veáis los resultados!!! 😉

Jordi

Share Button

Sierra Railway No. 3, La Central Pacific de Regreso al Futuro III

Estas navidades, haciendo el tradicional maratón de Regreso al Futuro (esta vez  ya desde mi propio sofá!), me llamó la atención del ferrocarril a vapor que aparece en la tercera parte. Bien… digamos que no era muy difícil deducir cuál era la compañía que representaba… Central Pacific. Pensé que era algo “inventado”, pero no, tiene historia, y vaya historia…

La locomotora utilizada fue la 131, llamada “Sierra Railway No. 3“. Fue construida en 1891, por Rogers Locomotive Works of Paterson N.J., también llamada la “locomotora a vapor estrella del cine” (movie star steam locomotive) ya que apareció en mas de 100 películas y series de televisión…

Y luego, la compañía Central Pacific, si cabe, con mas historia que la propia locomotora, por supuesto… Fue la compañía ferroviaria en construir la primera linea de ferrocarril transcontinental de los Estados Unidos de América, predecesora de la actual Union Pacific, de la cual soy especialmente fan.

Mapa Union Pacific Railroad 1925

Mapa Union Pacific Railroad 1925

Y para finalizar, el enlace a una espléndida página / museo de la Central Pacific.

Ah!!! Y este video, que he encontrado, de la locomotora, mientras grababan la secuencia del regreso al futuro… 😉



Disfrutadlo!

Jordi

Share Button

Nueva sección de viajes

Inauguro mi nueva sección de viajes, detallando nuestro último desplazamiento de estas Navidades, a Donostia – San Sebastián. Os muestro los sitios que hemos visitado y os detallo algunos precios y el por qué de todo ello.

Mi idea con esta sección es poder compartir con todos vosotros, por un lado nuestras experiencias, y por el otro, información que creemos os pueden ayudar a decidiros a viajar o cómo viajar a destinos en los que yo he estado.

Espero que os guste y la encontréis útil!!

Esta es la url: https://www.jormc.es/viajes

Una vez mas, gracias por leerme.

 

Jordi

Share Button

Hola… de nuevo!!!

Bien… esto… no tengo excusa: soy informático, y para colmo electrónico. Y si, me he cargado mi sitio web… ¬¬’

Como os lo digo… Muchos ya sabréis lo que les suele suceder a los informáticos /barra/ electrónicos: “bah, pa’qué voy yo a leerme las instrucciones, no me hacen falta…”

Sólo os digo una cosa, no es oro todo lo que reluce, y para muestra un botón: si tenéis WordPress 3.4 instalado y os aparece la pestañita amarilla “desea actualizar a la versión 3.5.1…” decidle NOOOOOO… a no ser que estéis muy seguros de lo que hacéis, o bien, tengáis una copia de seguridad en condiciones de vuestro sitio. Yo no la tenía, y como por un lado me entra y por otro me sale, le dí al dichoso botoncito… Y zas!!! A tomar por saco la web.

Pues eso, nada que me lo he cargado todo.

Empezamos de nuevo!!!

 

Jordi

Share Button