Intereting Posts

Отправка правильного размера файла с помощью скрипта загрузки 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; } 

Первоначально из http://paul.luminos.nl/update/471 :

Веб-сайт CrimsonBase проверяет загрузки, передавая их через надежный PHP-скрипт, подобный тому, который был опубликован Эндрю Джонсоном в его статье о загрузке файлов с поддержкой PHP .

Андрей делает очень важный комментарий в конце статьи:

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

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

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

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

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

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

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