Foros del Web » Programando para Internet » PHP »

Problema en descarga de archivos con PHP y Cookies

Estas en el tema de Problema en descarga de archivos con PHP y Cookies en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/08/2009, 07:32
Avatar de marce_str  
Fecha de Ingreso: septiembre-2006
Ubicación: La Plata, Argentina
Mensajes: 203
Antigüedad: 17 años, 6 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!
  #2 (permalink)  
Antiguo 13/08/2009, 11:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema en descarga de archivos con PHP y Cookies

Si estas indicando que cuando te logueas sin usar cookies baja el documento y si se loguea usando cookies no baja el documento lo mas probable el problema debe estar en la validación del cookie, puede que este enviando algo al navegador y cuando vas a bajar el documento al usar header no lo puede hacer ya que ya enviaste algo al navegador. Estoy especulando por lo que has dicho. Verifica lo que te indique y nos dejas saber
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 13/08/2009, 11:39
Avatar de marce_str  
Fecha de Ingreso: septiembre-2006
Ubicación: La Plata, Argentina
Mensajes: 203
Antigüedad: 17 años, 6 meses
Puntos: 1
Respuesta: Problema en descarga de archivos con PHP y Cookies

abimaelrc, sabés qué pasa...

si yo quito esas 2 líneas que aclaré después la función devuelve el archivo (sin formato)... de todas formas el archivo que descargo, no tiene por qué validar, porque es un documento a parte (xls o doc), aunque tiene sentido lo que decís:
Cita:
Iniciado por abimaelrc Ver Mensaje
enviaste algo al navegador
Yo estoy enviando el archivo ese al navegador para que se descargue...

Igual no sé cómo se puede validar, así que si alguien tiene una idea, lo agradecería mucho.

Saludos!
  #4 (permalink)  
Antiguo 13/08/2009, 12:03
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema en descarga de archivos con PHP y Cookies

No me refiero a la validación del archivo que se va a cargar, sino me refiero a la validación de la cookie. Como tu indicas que cuando ejecutas el archivo sin cookies se puede descargar, pero que cuando se loguea con cookie no se puede por lo tanto entiendo que el problema hay que buscarlo primero en la validación de la cookie. Si es posible coloca el codigo del cookie a ver si hay algo que este enviando al navegador y por ende no te va a funcionar los header para bajar los archivos.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 13/08/2009, 19:37
Avatar de marce_str  
Fecha de Ingreso: septiembre-2006
Ubicación: La Plata, Argentina
Mensajes: 203
Antigüedad: 17 años, 6 meses
Puntos: 1
Respuesta: Problema en descarga de archivos con PHP y Cookies

Con esto genero la cookie:

Código PHP:
if ($_POST['check'] == "on") {
                    
$valorCookie md5($loginUsername.date("Y-n-j H:i:s"));
        
                    
// Guardo el valor de la cookie en la base de datos
                    
$updateDATE sprintf("UPDATE usuarios SET cookie=%s  WHERE usuarioID= %s",
                                   
GetSQLValueString($valorCookie"text"),
                                   
GetSQLValueString($loginUsuarioID"int"));
            
                    
mysql_select_db($database_cnx$cnx);
                    
$Result1 mysql_query($updateDATE$cnx) or die(mysql_error());
                    
                    
// Guardo las cookies en el navegador
                    
setcookie("AP_usuarioID"$loginUsuarioIDtime()+(60*60*24*30));
                    
setcookie("AP_cookieID"$valorCookie,    time()+(60*60*24*30));
                } 

Y con esto la valido... es un lio, ya no me entiendo ni yo jeje...

Código PHP:
##############################################
#Controlo la existencia de Cookies
#############################################
//primero tengo que ver si el usuario está memorizado en una cookie
##########################################################################################################################
if (isset($_COOKIE["AP_usuarioID"]) && isset($_COOKIE["AP_cookieID"])) {##########################################################################################################################
       //Comprobar que esas variables no estén vacías
       
    
$usuario $_COOKIE["AP_usuarioID"];
    
$cookie $_COOKIE["AP_cookieID"];

    
//Voy a ver si corresponden con algún usuario
    
mysql_select_db($database_cnx$cnx);
    
$LoginRS__query sprintf("SELECT  
                                  usuarioID, 
                                  email, 
                                  password, 
                                  tipoID 
                                  FROM 
                                  usuarios 
                                  WHERE 
                                  usuarioID = %s AND 
                                  cookie = %s AND
                                  tipoID = 1"

                                  
GetSQLValueString($usuario"int"), 
                                  
GetSQLValueString($cookie"text"));
    
$LoginRS mysql_query($LoginRS__query$cnx) or die(mysql_error());
    
$loginFoundUser mysql_num_rows($LoginRS);
    if (
$loginFoundUser 0) {
                        
        
$loginStrGroup  mysql_result($LoginRS,0,'tipoID');
        
$loginUsuarioID  mysql_result($LoginRS,0,'usuarioID');
        
$loginUsername  mysql_result($LoginRS,0,'email');
    
        if ((!isset(
$_SESSION['MM_Username'])) && (!isset($_SESSION['MM_Username']))) { // Si no hay variables de sesión las cargo! porque caducaron
            //Declaro nuevamente las variables de sesión
            
$_SESSION['MM_Username'] = $loginUsername;
            
$_SESSION['MM_UserGroup'] = $loginStrGroup;
            
$_SESSION['MM_UserID'] = $loginUsuarioID;
            
                
            
$_SESSION['inicio'] = $MM_redirectLoginSuccess;
            
$_SESSION["ultimoAcceso"] =  date("Y-n-j H:i:s");
            
            
//Actualizo la fecha del último login del usuario que se registra
            
$updateDATE sprintf("UPDATE usuarios SET last_login=%s  WHERE usuarioID= %s",
                   
GetSQLValueString(mdsTSlocal($setGMT), "text"),
                   
GetSQLValueString($loginUsuarioID"int"));
            
mysql_select_db($database_cnx$cnx);
            
$Result1 mysql_query($updateDATE$cnx) or die(mysql_error());
        }
        
        
        if (isset(
$_SESSION['PrevUrl']) && false) {
            
$MM_redirectLoginSuccess $_SESSION['PrevUrl'];    
        }
        
header("Location: " $MM_redirectLoginSuccess );
    }
} else {
##########################################################################################################################
    
$MM_restrictGoTo "login.php";
    if (!((isset(
$_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers$_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {   
            
$MM_qsChar "?";
            
$MM_referrer $_SERVER['PHP_SELF'];
            if (
strpos($MM_restrictGoTo"?")) $MM_qsChar "&";
            if (isset(
$QUERY_STRING) && strlen($QUERY_STRING) > 0
                
$MM_referrer .= "?" $QUERY_STRING;
                
$MM_restrictGoTo $MM_restrictGoTo$MM_qsChar "accesscheck=" urlencode($MM_referrer);
                
header("Location: "$MM_restrictGoTo); 
                exit;
    } else {
        if (
$_SERVER['SERVER_NAME']!='localhost')  {
                
## Si no estamos en local verificamos la sesión para determinar si hay que expirarla
                //sino, calculamos el tiempo transcurrido
                
$fechaGuardada $_SESSION["ultimoAcceso"];
                
$ahora date("Y-n-j H:i:s");
                
$tiempo_transcurrido = (strtotime($ahora) - strtotime($fechaGuardada));
    
                
//comparamos el tiempo transcurrido
                
if ($tiempo_transcurrido >= 1200) {
                    
//si pasaron 20 minutos o más
                    
session_destroy(); // destruyo la sesión
                    
header("Location: login.php?msg=expire"); //envío al usuario a la pag. de autenticación
                    //sino, actualizo la fecha de la sesión
                
} else {
                    
$_SESSION["ultimoAcceso"] = $ahora;
                }
        } 
// Cierra el if de LOCALHOST asi no expira al realizar las pruebas
    
}


Te recuerdo que la funcion funciona (casi) bien cuando quito estas líneas
Código PHP:
header("Content-Type: ".$ctype);
header("Content-Disposition: attachment; filename=".basename($filename).";" ); 
Por eso debe haber algún problema con la cookie y los headers que especifico ahí
  #6 (permalink)  
Antiguo 14/08/2009, 07:31
Avatar de marce_str  
Fecha de Ingreso: septiembre-2006
Ubicación: La Plata, Argentina
Mensajes: 203
Antigüedad: 17 años, 6 meses
Puntos: 1
Respuesta: Problema en descarga de archivos con PHP y Cookies

SOLUCIONADO!!

abimaelrc gracias!! me abriste un poco la cabeza!

estuve buscando y buscando, usé una función para listar todas cabeceras enviadas headers_list();
Y con esto vi que las cookies no eran enviadas.

Y ahí me avivé de poner esto en la función

Código PHP:
global $usuario$cookie
y luego cargar nuevamente las cookies
Código PHP:
header('Set-Cookie: AP_usuarioID='.$usuario);
header('Set-Cookie: AP_cookieID='.$cookie); 
y anduvo perfecto!

Gracias!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:01.