En una reciente aplicación me veo en la necesidad de utilizar esta técnica en PHP para forzar a los usuarios a descargar archivos, estuve navegando en Internet y encontré varias maneras de hacerlo, todas parecidas.
Los beneficios que te da el pasar por un script PHP para descargar un archivo son muchos, y definitivamente mejores que el de poner el link directo al archivo para descargar, estos son algunos beneficios que podemos aplicar si utilizamos un archivo de puente para la descarga:
- Validar si el usuario esta logueado.
- Incrementar un contador de descargas para cada archivo.
- Guardar el numero IP desde donde se realiza la descarga.
- Colocar la carpeta de descarga un nivel antes del «/root» para que no puedan ingresar directamente a los archivos.
Esto lo deben colocar en un archivo, por ejemplo «download.php»
< ?php if (!isset($_GET['file']) || empty($_GET['file'])) { exit(); } $file = $_GET['file']; $file = basename($file); $file = "img/".$file; if(is_file($file)) { // requerido para IE if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } if (function_exists('mime_content_type')){ $type = mime_content_type($file); }else if (function_exists('finfo_file')){ $info = finfo_open(FILEINFO_MIME); $type = finfo_file($info, $file); finfo_close($info); }else{ switch(strtolower(end(explode('.',$file)))) { case 'pdf': $type = 'application/pdf'; break; case 'zip': $type = 'application/zip'; break; case 'jpeg': case 'jpg': $type = 'image/jpg'; break; default: $type = 'application/force-download'; } } header('Pragma: public'); // required header('Expires: 0'); // no cache header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($file)).' GMT'); header('Cache-Control: private',false); header('Content-Type: '.$type); header('Content-Disposition: attachment; filename="'.basename($file).'"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($file)); header('Connection: close'); readfile($file); exit(); } ?>
Para llamarlo basta con poner en alguna pagina un link para descargar y adjuntar como parametro a la imagen.
http://www.pruebas.com/download.php?file=imagen1.jpg
Hola he probado el codigo pero lo que hace es poner la pagina en blanco y no da ningun error… ayuda por favor
gracias
Comments are closed.