2009-12-29 19 views
6

Utworzono skrypt pobierania pliku w PHP, działa, ale przeglądarki internetowe zgłaszają plik jako "Unknown Length". Mój kod jest następujący:Wysyłanie prawidłowego rozmiaru pliku za pomocą skryptu pobierania 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; 
} 

Odpowiedz

13

Pochodzi z http://paul.luminos.nl/update/471:

CrimsonBase website weryfikuje pobieranie przez przepuszczanie ich przez solidnego skryptu PHP podobny do opublikowanej przez Andrew Johnson w his article about PHP-controlled file downloads.

Andrew robi bardzo ważną komentarz na końcu artykułu:

„Jeśli kompresować pliki z zlib mod_deflate a więc w nagłówku Content-Length nie będą dokładne, więc będziemy kończyć gdy widzisz "Nieznany rozmiar" i "Nieznany pozostały czas" podczas pobierania plików. "

Chciałbym podkreślić w ten sposób: jeśli Twoja przeglądarka nie wydaje się być posłuszni nagłówki generowane przez skrypt PHP, zwłaszcza Content-Length -to jest dość prawdopodobne, że Apache mod_deflate rozszerzenie jest włączone.

można łatwo wyłączyć go za pomocą pojedynczego skryptu stosując następującą linię w obowiązującym .htaccess pliku:

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

gdzie download.php jest tutaj zakłada się w skrypcie do pobrania znajduje się w ścieżce katalogu głównego serwera (np. www.crimsonbase.com/download.php). (To dlatego, że wyrażenie regularne jest ^/download\.php.)

+0

Interesujące. Muszę się nad tym zastanowić. –

+0

Dziękuję, otrzymywałem typ zawartości "gzip" w moim pobraniu i udało mi się go pozbyć za pomocą linii htaccess, teraz widzę postęp pobierania, ponieważ całkowity rozmiar pliku jest poprawnie odczytywany przez przeglądarkę. – adrianTNT

0

Nie należy spłukiwać pamięci podręcznej przed funkcją readfile(). Mój kod jest prawie identyczny z twoim, i działa dobrze.

+0

Wypróbowałem to, nic. Pobieranie nadal działa dobrze, po prostu przeglądarki internetowe powiedzą "nieznany rozmiar pliku", mimo że nadałem mu "Długość treści". Chodzi o to, że jeśli użyję wget, zgłasza poprawny rozmiar pliku. –

6

miałem ten sam problem, i naprawiłem go wysyłając nagłówek Content-Length przed 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); 
Powiązane problemy