Download di file zip, ma non è valido?

Io uso questo codice per consentire agli utenti di scaricare un file zip:

if(file_exists($filename)){ header("Content-Disposition: attachment; filename=".basename(str_replace(' ', '_', $filename))); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Description: File Transfer"); header("Content-Length: " . filesize($filename)); flush(); $fp = fopen($filename, "r"); while (!feof($fp)) { echo fread($fp, 65536); flush(); } fclose($fp); exit; } 

Quando il file viene scaricato, scarica solo 25,632 kilobyte di dati. Tuttavia il file zip è 26.252 kilobyte …

Perché il browser ottiene tutti i 25 MB, ma poi si ferma?

Ho controllato l'intestazione Content-Length per assicurarmi che fosse corretto ed è …

modificare

In firefox, quando scarico il file, viene visualizzato 'of 25mb' SO il browser pensa che 25mb sia la quantità COMPLETA … tuttavia, la lunghezza del contenuto quando echo è 26252904?

Le tue header('Content-Type ...) sono inutili in quanto solo l'ultima sarà inviata al browser.

I download sono triggersti ​​da Content-Disposition: attachment . Dovresti submit l'attuale Content-Type: application/zip se stai inviando un file zip.

Infine, il tuo ciclo di lettura non è necessario.

Mettendo tutto insieme, il tuo codice dovrebbe assomigliare a questo:

 if (file_exists($filename)) { $quoted_filename = basename(addcslashes($filename, "\0..\37\"\177")); header("Content-Disposition: attachment; filename=\"{$quoted_filename}\""); header('Content-Type: application/zip'); header('Content-Length: '.filesize($filename)); readfile($filename); } 

aggiungilo prima del tuo codice

 ob_clean(); ob_end_flush(); 

Utilizzare un singolo tipo MIME per rappresentare i dati.

In questo caso l'uso di application/octet-stream andrà benissimo. Questo è quando non conosci il MIME prima della mano. Quando lo sai, devi metterlo. Non utilizzare più intestazioni del tipo di contenuto.

Di solito, quando il browser non sa come gestire un determinato MIME, attiverà il process di download. Inoltre, utilizzando Content-disposition: Attachment; .. Content-disposition: Attachment; .. assicura.

Esiste un semplice readfile($filename) che invierà i byte del file al process di richiesta come di seguito:

 header("Content-disposition: attachment;filename=" . basename($filename); readfile($filename); 

Ho avuto un problema simile. Il file scaricato bene in Firefox ma non in IE. Sembrava che Apache stesse comprimendo i file e IE non era in grado di decomprimere, quindi i file erano corrotti. La soluzione era disabilitare gzipping in Apache. Puoi anche controllare se PHP non è gzipping al volo e disabilitarlo. Per Apache puoi provare:

 SetEnv no-gzip 1 

E per PHP, in .htaccess:

 php_flag zlib.output_compression on 

Questa risposta è per niente una VERA RISPOSTA.

Comunque l'ho fatto funzionare … Ho impostato il Content-Length a 30000000. Perciò pensa che il file sia più grande di quello che è in realtà, e poi lo scarica tutto.

Trucco brutto lo so, ma non riuscivo a trovare NESSUN altro modo