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:
Si nos vamos a la funcion que pone el enlace, encontramos que este es de la forma:<?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;
Código:
La funcion que hace la descarga (en func_archivo.php):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.
Código:
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).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; }
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.