Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2007, 16:33
jefmetal
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 4 meses
Puntos: 0
problema con descarga de ficheros y sesiones

Hola.

Tengo una pagina de descarga de fotos, videos, etc en la los usuarios han de estar logados. El problema aparece al descargar algo de dicha pagina (abriendo fotos en ventanas nuevas no hay problemas). El fichero descargado resulta ilegible para el cliente. Use uno de texto como prueba y añade un salto de linea al principio de este (no un < br >, sino un salto). Las variables y la sesion se transmiten por URL de forma correcta. He revisado el codigo y no se añade nada antes de enviar las HEADER. Os pongo parte del codigo, ya que resulta muy extenso:

Script index.php
Código:
<?php

global $web_dir,$web_temp,$path_upload,$grupo_ses,$nombre_ses,$dominio;	

session_start();                                                  //inicio sesion
$web_dir="d:\\web\\web";
$web_temp="d:\\web\\temp";
$path_upload="d:\\web\\upload";
$dominio="http://localhost/";

include "modulo_verificacion_seguridad.php";    //verifico usuario logado
include "func_cadena.php";                                //funciones
include "func_archivo.php";

            ...    Aqui hay codigo comparando diversas opciones (sin imprimir nada)

	$rut=$_GET["p"];                                      //tomo la ruta relativa 'p' del fichero
	switch ($_GET["t"]) {                               //tomo la opcion elegida (en este caso fotod) 
                 ..... 

	case "fotod":		                                 //selecciona descargar la foto
		$archiv=$_GET["f"];			    //nombre del fichero
		$file=$web_dir$rut/$archiv";           //tomamos la ruta relativa del fichero.
		$file=path_a_win($file);	        //La convertimos a formato windows (\ por /)
		Descargar($file);			    //Llamo a funcion de descarga
		break;

                ...      Aqui hay mas codigo         (mas opciones pasadas por 't')

}
	exit;
Si nos vamos a la funcion que pone el enlace, encontramos que este es de la forma:

Código:
echo "<a href=\"index.php?$ID&p=$ruta&f=$imagen&t=foto\" TARGET=\"_blank\"><img border=\"0\" src=\"$ruta/tb/$imagen"></a>\n"; // Es un thumb. Si se pincha muestra imagen en nueva ventana, funciona ok.
echo "<a href=\"index.php?$ID&p=$ruta&f=$imagen&t=fotod\" TARGET=\"_blank\">".$imagen."</a><br>\n"; //Si pinchamos en nombre de la foto descarga el fichero con la foto. Carga de nuevo index.php con las opciones adecuadas.
La funcion que hace la descarga (en func_archivo.php):

Código:
function Descargar($ruta_comp){

    ob_start();
    $fichero = basename($ruta_comp); 
    header("Content-Type: application/octet-stream");  
    //header( "Content-Length: ".filesize($ruta_comp));  //Probado con y sin ello
    header("Content-Disposition: attachment; filename=".$fichero);
    header("Content-Transfer-Encoding: binary");  //Probado con y sin ello
    header("Pragma: no-cache"); //Probado con y sin ello
    header("Expires: 0"); //Probado con y sin ello
    readfile($ruta_comp);
    ob_end_flush();
    
    exit;
}
El problema no ocurre solo con fotos, sino con ficheros comprimidos zip, videos (mov, 3gp y avi), etc... El fichero descargado siempre es mayor que el original (2 bytes). Sospecho que el problema esta en las cabeceras. Podeis ver el error? Uso PHP 5.2.5 para Windows (XP) instalado como modulo de Apache (Apache v2.2.6).

He probado con session.use_trans_id on y off, y varias opciones mas cambiadas pero nada. Las cookies estan quitadas, todo la sesion se pasa por URL.

Saludos y gracias.