2009-12-29 2 views
6

Я создал скрипт загрузки файлов в PHP, он работает, но веб-браузеры сообщают файл как «Неизвестная длина». Мой код выглядит следующим образом:Отправка правильного размера файла с помощью скрипта загрузки 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; 
} 

ответ

13

Родом из http://paul.luminos.nl/update/471:

CrimsonBase website проверяет загрузку, пропуская их через надежный PHP скрипт, подобной той, опубликованной Эндрю Джонсон в his article about PHP-controlled file downloads.

Эндрю делает очень важное замечание в конце статьи:

«Если сжать файлы с Zlib, mod_deflate и так далее заголовка Content-Length не будет точно, так что вы будете в конечном при просмотре файлов «Неизвестный размер» и «Неизвестное время».

Я хотел бы подчеркнуть: если ваш браузер не по всей видимости, повинуясь заголовками, генерируемых вашего PHP скрипт, особенно Content-Length -это довольно вероятно, что mod_deflate расширения Апача включена.

Вы можете легко отключить его для одного сценария, используя следующую строку в соответствующем .htaccess файле:

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

где download.php здесь предполагаются в сценарии загрузки, расположенном в пути корневой директории сервера (например, www.crimsonbase.com/download.php). (Это потому, что регулярное выражение ^/download\.php.)

+0

Интересно. Мне нужно посмотреть на это. –

+0

Спасибо, я получал тип контента «gzip» в моей загрузке и был в состоянии избавиться от него с помощью вашей линии htaccess, теперь я снова вижу прогресс загрузки, потому что общий размер файла корректно считывается браузером. – adrianTNT

0

Не пытайтесь очистить кеш до функции readfile(). Мой код почти идентичен вашему, и работает отлично.

+0

Пробовал это, ничего. Загрузка по-прежнему прекрасна, просто веб-браузер скажет «неизвестный размер файла», хотя я дал ему «Content-length». Дело в том, что если я использую wget, он сообщает о правильном размере файла. –

6

У меня была такая же проблема, и я установил его, отправив заголовок Content-Length перед 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); 
Смежные вопросы