Académique Documents
Professionnel Documents
Culture Documents
1 de 2
http://www.cristalab.com/tutoriales/forzar-descargas-con-php-c166l/
Artculos
Foros
Tutoriales
Tips
Cursos
Tags
Buscar
Ests en: Cristalab > Tutoriales > Forzar descargas con PHP
Lenguajes de servidor
2601 de clabLevel
Otros artculos de fael
51,633 visitas
php
Hacer descargables cualquier tipo de archivos no es muy complicado. La mayora de las tecnologas del lado del servidor nos permiten
hacer esto, en este caso veremos cmo es con PHP.
El script fue sacado del todopoderoso php.net y es el siguiente:
<?php
$f = $_GET["f"];
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen("$f", "r");
fpassthru($fp);
?>
De esta forma, cuando necesitemos que el explorador quiera descargar, por ejemplo un archivo de imagen, lo llamaramos
descargar.php?f=imagen.jpg.
Y el navegador abrir el dilogo de descarga:
Sencillo, no? Bien, pero podra haber serios problemas, dejar el script as podra hacer descargable cualquier tipo de archivo, incluyendo
el cdigo fuente de otros archivos php.
A continuacin veremos cmo implementar algunas medidas de seguridad.
2 de 2
http://www.cristalab.com/tutoriales/forzar-descargas-con-php-c166l/
podemos descargar.
Adems, para evitar que se pueda navegar en otros directorios, vamos a implementar una comprobacin.
Listando los archivos descargables.
til cuando son relativamente pocos los archivos descargables, los nombres los metemos en un arreglo y hacemos una sencilla
comprobacin y listo.
<?php
$archivos = array("imagen.jpg", "logo.png", "flash.swf");
$f = $_GET["f"];
if(strpos($f,"/")!==false){
die("No puedes navegar por otros directorios");
}
if(!in_array($f,$archivos)){
die("<b>ERROR!</b> no es posible descargar $f");
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen("$f", "r");
fpassthru($fp);
?>
De esta forma, si queremos descargar un archivo que no sean los que enlistamos en el arreglo, nos aparecer el mensaje de error:
ERROR! no es posible descargar archivo.ext
Adems este script es sensitivo a maysculas y minsculas, no es lo mismo flash.swf que Flash.swf, fLaSh.SwF... etc
Pero qu pasa cuando tenemos 100 imagenes en formato jpg, png y gif que querramos que el usuario pueda descagar? Para eso usamos un
filtrado de extensin.
Listando las extensiones de los archivos que puedan ser descargables
La lgica es igual, usar in_array para saber si el archivo a descargar tiene una de las extensiones que hemos marcado como descargables,
esto se hace con explode y count, seguramente habr una forma ms eficiente de hacerlo pero no la conozco.
<?php
$extensiones = array("jpg", "jpeg", "png", "gif");
$f = $_GET["f"];
if(strpos($f,"/")!==false){
die("No puedes navegar por otros directorios");
}
$ftmp = explode(".",$f);
$fExt = strtolower($ftmp[count($ftmp)-1]);
if(!in_array($fExt,$extensiones)){
die("<b>ERROR!</b> no es posible descargar archivos con la extensin $fExt");
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen("$f", "r");
fpassthru($fp);
?>
Y con esto la descarga de archivos se hace ms fcil y ms segura. Espero les haya servido.
Informacin adicional
Si tienes alguna pregunta de este tutorial; puedes hacerla aqui en los foros
Cristalab | Artculos | Foros | Comics | Tutoriales | Tutoriales de Flash | Ejemplos | Anime | Tips | FAQ | Colaborar