Я создал сценарий загрузки файла в 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 не будет точным, поэтому вы увидите« Неизвестно » size "и" Неизвестное оставшееся время "при загрузке файлов".
Я хотел бы подчеркнуть следующее: если ваш браузер не подчиняется заголовкам, созданным вашим PHP-скриптом, особенно
Content-Length
- вполне вероятно, что расширение Apachemod_deflate
включено.Вы можете легко отключить его для одного сценария, используя следующую строку в соответствующем файле
.htaccess
:SetEnvIfNoCase Request_URI ^ / download \ .php no-gzip dont-var {{1} }
где здесь предполагается, что download.php находится в сценарии загрузки, расположенном в пути к корневому каталогу сервера (например,
www.crimsonbase.com/download.php
). (Это потому, что регулярное выражение^ / download \ .php
.)
Попробуйте не промывать кэш перед функцией Readfile(). В остальном мой код почти идентичен вашему и работает нормально.
.