2009-12-29 11 views
6

Creé un script de descarga de archivos en PHP, funciona, pero los navegadores web informan el archivo como "Longitud desconocida". Mi código es el siguiente:Envío del tamaño de archivo correcto con script de descarga de PHP

function downloadFile($file){ 
    // Set up the download system... 
    header('Content-Description: File Transfer'); 
    header('Content-Type: '.mime_content_type($file)); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: '.filesize($file)); 

    // Flush the cache 
    ob_clean(); 
    flush(); 

    // Send file to browser 
    readfile($file); 

    // DO NOT DO ANYTHING AFTER FILE DOWNLOAD 
    exit; 
} 

Respuesta

13

Originalmente desde http://paul.luminos.nl/update/471:

El CrimsonBase website verifica descargas pasándolos a través de un script PHP robusta similar a la publicada por Andrew Johnson en his article about PHP-controlled file downloads.

Andrew hace un comentario muy importante al final del artículo:

"Si comprime los archivos con Zlib, mod_deflate y así en la cabecera Content-Length no será precisa por lo que va a terminar viendo "Tamaño desconocido" y "Tiempo desconocido restante" al descargar archivos. "

Me gustaría hacer hincapié en esto: si su navegador no parece estar obedeciendo las cabeceras generadas por su script PHP, sobre todo es bastante probable que la extensión de Apache mod_deflate está activado Content-Length -es.

Se puede desactivar fácilmente para una única secuencia de comandos mediante la siguiente línea en un archivo de .htaccess aplicable:

SetEnvIfNoCase Request_URI ^/download\.php no-gzip dont-vary 

donde download.php está aquí supone que en el script descarga situado en la ruta del directorio raíz del servidor (por ejemplo, www.crimsonbase.com/download.php). (Esto se debe a la expresión regular es ^/download\.php.)

+0

Interesante. Tendré que investigar eso. –

+0

Gracias, estaba obteniendo el tipo de contenido "gzip" en mi descarga y pude deshacerme de él con su línea htaccess, ahora puedo ver el progreso de la descarga nuevamente porque el navegador lee el tamaño total del archivo correctamente. – adrianTNT

0

Intente no enjuagar la caché antes de la función readfile(). Mi código es casi idéntico al tuyo, y funciona bien.

+0

Probé eso, nada. La descarga todavía funciona bien, es solo que los navegadores web dicen "tamaño de archivo desconocido" aunque le dí una "longitud del contenido". La cosa es que si uso wget, informa el tamaño correcto del archivo. –

6

tenía este mismo problema, y ​​me fijo mediante el envío de la cabecera Content-Length antes de la Content-Disposition.

header('Content-Type: video/mp4'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-Length: ".filesize($file_url)); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
readfile($file_url); 
Cuestiones relacionadas