Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/08/2009, 07:32
Avatar de marce_str
marce_str
 
Fecha de Ingreso: septiembre-2006
Ubicación: La Plata, Argentina
Mensajes: 203
Antigüedad: 17 años, 7 meses
Puntos: 1
Problema en descarga de archivos con PHP y Cookies

Hola a todos, me ha pasado algo muy extraño a lo que no le encuentro sentido.
Tengo una aplicación hecha en PHP y MySQL, las páginas tienen acceso restringido y tiene la opción de insertar una cookie para recordar al usuario.

Por otro lado tengo un archivo download.php que uso para descargar documentos al pasarle un parámetro en la URL.
Este archivo busca en la base de datos filtrando por ese parámetro y devuelve el nombre del documento.
Luego ejecuto una función para forzar la descarga.

Código PHP:
function downloadFile$filename ) {
    
$ext substr$filename,-);
    if( 
$filename == "" ) {
       echo 
"<html><body>ERROR: Empty file to download. USE download.php?file=[file path]</body></html>";
       exit;
    } elseif ( !
file_exists$filename ) ) {
       echo 
"<html><body>ERROR: File not found. USE download.php?file=[file path]</body></html>";
       exit;
    };
    switch( 
$ext ){
       case 
"pdf"$ctype="application/pdf";                
       break;
       case 
"exe"$ctype="application/octet-stream";        
       break;
       case 
"zip"$ctype="application/zip";                
       break;
       case 
"doc"$ctype="application/msword";                
       break;
       case 
"xls"$ctype="application/vnd.ms-excel";        
       break;
       case 
"ppt"$ctype="application/vnd.ms-powerpoint";     
       break;
       case 
"gif"$ctype="image/gif";                        
       break;
       case 
"png"$ctype="image/png";                        
       break;
       case 
"jpg"$ctype="image/jpg";                        
       break;
       default:    
$ctype="application/force-download";
    }

    
header("Pragma: public");
    
header("Expires: 0");
    
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    
    
header("Content-Type: ".$ctype);
    
$user_agent strtolower ($_SERVER["HTTP_USER_AGENT"]);
    if ((
is_integer (strpos($user_agent"msie"))) && (is_integer (strpos($user_agent"win")))) {
       
header"Content-Disposition: filename=".basename($filename).";" );
    } else {
       
header"Content-Disposition: attachment; filename=".basename($filename).";" );
    }

    
header("Content-Transfer-Encoding: binary");
    
header("Content-Length: ".filesize($filename));
    
    
readfile($filename);
    exit();


Cuando me registro normalmente (sin la cookie) todo funciona perfecto. Se pueden descargar los archivos.

Pero al intentar descargar algún documento cuando me he registrado con la cookie me dice que el documento no ha sido encontrado.

Estuve revisando la función línea por línea y está bien.
El problema parece estar en las siguientes 2 líneas:

Código PHP:
header("Content-Type: ".$ctype);
header("Content-Disposition: attachment; filename=".basename($filename).";" ); 
Al comentar estas líneas la función se ejecuta sin errores, encuentra los documentos, pero obviamente los muestra sin formato (como si se abriera un .xls en el bloc de notas).

Me gustaría saber cuál es el problema o incompatibilidad. Si es un problema en la programación o hay que agregar algo en el .htaccess.

Muchas gracias. Saludos!