Отправка корректного размера файла с 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;
}
9
задан Rocket Hazmat 29 December 2009 в 02:40
поделиться

2 ответа

Исходя из http://paul.luminos.nl/update/471 :

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

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

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

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

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

 SetEnvIfNoCase Request_URI ^ / download \ .php no-gzip dont-var {{1} } 

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

15
ответ дан 4 December 2019 в 08:52
поделиться

Попробуйте не промывать кэш перед функцией Readfile(). В остальном мой код почти идентичен вашему и работает нормально.

.
0
ответ дан 4 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: