1 de octubre de 2007

PHP: Forzar la descarga de un fichero

A veces nos interesa que cuando un usuario se descargue de nuestro servidor un fichero PDF o un fichero MP3 en vez de abrirlo con su navegador.

Para ello tenemos que forzar la descarga. ¿Cómo lo hacemos?

Pues la clave está en este header header("Content-type: application/force-download"); con el que forzamos la descarga de PDFs.

Os pongo a continuación un ejemplo completo:
<?

$sDocumento = $_GET["doc"];

if(strpos($sDocumento,".pdf")||strpos($sDocumento,".PDF")){

header("Content-type: application/force-download");
header("Content-Length: ".filesize($sDocumento));
header("Content-Disposition: attachment; filename=".basename($sDocume
nto));
header("Content-Transfer-Encoding: binary");

if (!@readfile($sDocumento))
echo "Ha sido imposible descargar el fichero";
}

?>



A continuación grabamos un fichero php con este código con el nombre descargarPHP.php (lo podemos llamar cómo queramos) y lo subimos a nuestro servidor. Después renombramos cualquier PDF que tengamos a mano con el nombre ejemplo.pdf y lo subimos al servidor a la misma ruta que descargarPHP.php.

A continuación para descargar un fichero con este ejemplo tendremos que cargarlo cómo http://www.dominiodeejemplo.com/descargarPHP.php?doc=ejemplo.pdf

El PHP cuando lo carguemos intentará ahora forzar la descarga del fichero ejemplo.pdf y el pdf no se abrirá en el navegador.

Hay que tener mucho cuidado con este tipo de scripts ya que abrimos una puerta en nuestro servidor a ataques malintencionados. Este ejemplo en concreto sólo tiene cómo medida de seguridad un if para comprobar que el nombre del fichero contiene .pdf o .PDF por lo que os recomiendo encarecidamente que lo utilicéis sólo a modo de ejemplo. Si vais a utilizarlo en algún proyecto gordo introducid más medidas de seguridad para estar seguros de que un hacker no se descarga lo que debe.

Pues eso, si alguien tiene dudas que me escriba a gabicuesta@ono.com

Comparte este Post:
Menéame Digg!

No hay comentarios: