Forzar descarga de archivos con PHP

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

jfdghjhthit45

También te puede interesar

One Comment

  1. Alejo
    nov 17, 2010 @ 09:57:13

    Hola he probado el codigo pero lo que hace es poner la pagina en blanco y no da ningun error… ayuda por favor
    gracias