Foros del Web » Programando para Internet » PHP »

problema con descarga de ficheros y sesiones

Estas en el tema de problema con descarga de ficheros y sesiones en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/12/2007, 16:33
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 11 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.
  #2 (permalink)  
Antiguo 11/12/2007, 05:29
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: problema con descarga de ficheros y sesiones

Hola de nuevo.

Bien, despues de darle vueltas (hasta incluso eliminar casi todo el codigo), y de ver que nadie me responde (mi post es algo confuso), he optado por ver que cabeceras se envian.

Si llamo a la funcion Descargar:
Código:
function Descargar($ruta_comp) {
    ob_start();
    $fichero = basename($ruta_comp); 
    header("Content-Type: application/octet-stream\n");
    header("Content-Disposition: attachment; filename=\"$fichero\"\n");
    header("Content-Transfer-Encoding: binary\n");
    header("Content-Length: ". filesize($ruta_comp) . "\n");
    $bytes=readfile($ruta_comp);
    ob_end_flush();
}
pasandole como parametro la ruta completa de un fichero de texto, el fichero en cuestion se descarga ocupando 85 bytes, cuando el original tiene 83. De hecho inserta un código 13 y otro 10 (0D 0A en hex) al comienzo del mismo.

Si llamo a la url que me descarga el fichero desde otro script que me muestra las cabeceras obtengo:

Código:
Array ( [0] => HTTP/1.1 200 OK [1] => Date: Tue, 11 Dec 2007 11:25:19 GMT [2] => Server: Apache/2.2.6 (Win32) PHP/5.2.5 
[3] => X-Powered-By: PHP/5.2.5 [4] => Content-Disposition: attachment; filename="error.log" [5] => Content-Transfer-Encoding: binary [6] => Content-Length: 85 
[7] => Connection: close [8] => Content-Type: application/octet-stream )
Sin embargo si imprimo directamente la funcion filesize() del fichero original obtengo el valor correcto (83), mientras que en las cabeceras me aparece 85.

¿Alguien lo entiende o puede ver a que se deben estos 2 bytes??

Salu2
  #3 (permalink)  
Antiguo 11/12/2007, 06:03
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: problema con descarga de ficheros y sesiones

Vale, resuelto.

Como suele pasar despues de que uno se rompa los sesos dandole vueltas sin encontrar el problema, éste se debe a una soberana chorrada.

En uno de los ficheros include, habia un salto de linea antes del <?php, por lo que se escribe al fichero antes de las header.

Aun asi, gracias por leerlo y perdón por el post.

Un saludo.
  #4 (permalink)  
Antiguo 18/01/2008, 06:29
 
Fecha de Ingreso: enero-2008
Mensajes: 1
Antigüedad: 16 años, 10 meses
Puntos: 0
Hola! A mi paso lo mismo, solo que los fin de linea y retorno de carro los tenía luego del "?>". No le encuentro el sentido a esto...es decir, tengo un archivo php con includes en la cabecera y más adelante hago varias cosas: creacion de objetos, dump de la base mysql , zipeo el sql obtenido y finalmente se lo envío al cliente con

header("Cache-Control: ");// leave blank to avoid IE errors
header("Pragma: ");// leave blank to avoid IE errors
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename='.$fn);
header ("Content-Length: ".filesize($f));
readfile($f);

Ahora ...¿porque me agrega en este fichero zip (solo en el que voy a descargar en el cliente) los retornos de carro de los archivos de include, es un misterio para mi? Soy novato en programación web, pero supongo/imagino que al hacer el include, existira una rutina que hace algo así como un "echo" de cada linea del archivo y esta incluyendo los retornos de carro que estan antes o luego de los tags de php y estos otros comandos "header" transmiten al cliente todo lo que sea de tipo "print", "echo", readfile...(cualquier cosa que signifique una salida) y que a ocurrido durante "toda" la ejecución de este php. ¿Alguien me lo puede explicar si hay una forma de indicar claramente lo que se quiere enviar al cliente? En este ejemplo en los header esta bien indicado que es el archivo $f...pero agrega esto otro...me resulta una locura.¿?

El tema de estos "extraños" retornos de carro que terminan en el buffer de salida y que vienen de los archivos includes lo solucione en mi codigo borrando el buffer de salida ("ob_end_clean") antes de la transmisión. Me quedo algo así:

//borro el contenido del buffer de salida x cualquier basura que pueda tener (retornos de carro de los include x ejemplo)
ob_end_clean();

header("Cache-Control: ");// leave blank to avoid IE errors
header("Pragma: ");// leave blank to avoid IE errors
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename='.basename($this->fich_zip));
header ("Content-Length: ".filesize($this->fich_zip));
readfile($this->fich_zip);
ob_end_flush();

Última edición por GatorV; 18/01/2008 a las 08:50
  #5 (permalink)  
Antiguo 11/06/2012, 03:49
 
Fecha de Ingreso: junio-2012
Mensajes: 1
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: problema con descarga de ficheros y sesiones

Muchas gracias idasilva! Le has dado con el problema que llevaba horas buscando la solución!
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 14:07.