Crear y lanzar una descarga con PHP

Tutorial sobre cómo lanzar descargas de ficheros con php. Descargas PHP de imagenes u otros ficheros.

En este artículo voy a explicarte cómo lanzar una descarga de fichero mediante el uso de PHP con cabeceras (headers). Con esta funcionalidad podrás evitar el típico enlace directo a tus ficheros mediante etiquetas ahref u otra forma similar. 

Con esta metodología podríamos lanzar descargas con un id único y una ruta del estilo /descargar-fichero/ab123jri123kp o incluso mediante nombres únicos legibles para SEO cómo "el mejor portatil para programar.jpg".

En este tutorial voy a centrarme en explicarte las partes más importantes de esta funcionalidad de PHP, mostrarte cómo configurar las más complejas y por último te dejaré un snippet de copiar y pegar para que puedas probarlo.

Pasos para crear una descarga en PHP

Para crear cualquier descarga de fichero en PHP siempre tendrás que seguir unas mismas pautas:

  1. Saber la ruta del fichero a descargar.
  2. Saber su nombre.
  3. Configurar las cabeceras de tipo de contenido "Content-Type".
  4. Calcular el tamaño del fichero.
  5. Indicar un nuevo nombre al fichero.
  6. Abrir el fichero a enviar a través de la descarga.
  7. Imprimir el contenido.
  8. Cerrar la lectura del fichero.

A continuación voy a centrarme en ver solo las partes más importantes y complejas de este script php.

Configurar las cabeceras PHP de la descarga

Para la creación y manipulación de cabeceras http con php siempre tendremos en cuenta las mismas claves:

  • Las cabeceras PHP que utilizaremos indicarán al visitante (su navegador) que el contenido que se envía es el de un fichero y una página.
  • La configuración de cabeceras en PHP siempre se realiza con el mismo comando: header.

Estas son las pautas generales para toda configuración de cabeceras, así, para enviar una respuesta en forma de fichero descargable indicaremos las siguientes cabeceras:

<?php
$fichero_local = __DIR__ . '/mi-imagen.jpg'; //ruta al fichero en los directorios locales
$nombre_fichero = 'imagen-aprender-a-programar-php.jpg'; //nombre del fichero que se descargará el usuario
 header('Cache-control: private');
 header('Content-Type: application/octet-stream'); 
 header('Content-Length: '.filesize($local_file));
 header('Content-Disposition: filename='.$nombre_fichero);
?>

En estas cabeceras he indicado:

  1. El tipo de contenido "application/octet-stream".
  2. El tamaño del fichero en "Content-Length"
  3. Por último el nombre que quiero darle al fichero cuando el usuario se lo descargue.

De esta forma el fichero local se llama "mi-imagen.jpg" y el usuario descargará la imagen con el nombre "imagen-aprender-a-programar-php.jpg".

Pero aun no hemos terminado, tenemos que terminar el script mandando el contenido del fichero a descargar.

 

Enviar el contenido del fichero a descargar por el usuario

Ahora vamos a enviar al visitante el contenido del fichero a descargar, ya que hasta ahora solo habíamos configurado, para el navegador, que el contenido a mandar es un fichero y no una página HTML.

Manipularemos el fichero con tres funciones de php:

  • fopen: que permite abrir un fichero para leerlo.
  • fread: función php que obtiene el contenido del fichero.
  • fclose: función que cierra el fichero y lo libera.

El código que sigue a las cabeceras para este tutorial es el siguiente:

<?php
 //abrimos el fichero
 $file = fopen($fichero_local , "rb");

//imprimimos el contenido del fichero al navegador
print fread ($file, filesize($fichero_local )); 
 
//cerramos el fichero abierto
fclose($file);
?>

Sencillo ¿verdad? ahora, para terminar, solo queda explicarte cómo quedaría todo el código junto.

Snippet php para lanzar la descarga en el navegador de ficheros

A continuación te dejo el script completo para lanzar la descarga de un fichero.

Dependiendo de tu caso en concreto deberás cambiar las rutas del fichero local y el nombre de este. Por lo demás, el código es totalmente funcional y adaptado a cualquier descarga, ya sea un fichero zip o una imagen de cualquier tipo.

<?php
$fichero_local = __DIR__ . '/mi-imagen.jpg'; //ruta al fichero en los directorios locales
$nombre_fichero = 'imagen-aprender-a-programar-php.jpg'; //nombre del fichero que se descargará el usuario

if( file_exists($fichero_local ) && is_file($fichero_local) ) { //compruebo, por si acaso, que el fichero exista en el sistema

	header('Cache-control: private');
	header('Content-Type: application/octet-stream'); 
	header('Content-Length: '.filesize($local_file));
	header('Content-Disposition: filename='.$nombre_fichero);
 
    // flush content
    flush();

     //abrimos el fichero
     $file = fopen($fichero_local , "rb");

     //imprimimos el contenido del fichero al navegador
     print fread ($file, filesize($fichero_local )); 
 
     //cerramos el fichero abierto
     fclose($file);

} else {

    die('Error:  El fichero  '.$fichero_local .' no existe!');  //termino la ejecución de código por que el fichero no existe.

}
?>

¿Ya sabes cómo lanzar descargas con PHP?

Pues esto se ha terminado, espero que te haya sido realmente útil este tutorial y que empieces ya mismo a lanzar descargas con php a través de una url cualquiera. Yo suelo utilizar esta técnica cuando, tras subir una imagen con php o html a través de una intranet quiero ocultar la ruta de su ubicación.

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.