Заголовок Content-Length всегда равен нулю

Я устанавливаю заголовок следующим образом:

header('Content-Length: ' . filesize($strPath)); 

На моем ПК с ZendServer он отлично работает, и я могу загрузить файл с правильным размером файла. На производственном сервере Solaris с Apache и скомпилированным PHP я получаю файл с размером файла равным нулю, поэтому пустым файлом.

Есть ли параметр конфигурации? Что-то, что может помешать установить «Content-Length: 1222»?

Благодарю.

Код:

 <?php 

error_reporting (E_ALL); ini_set ('display_errors', '1');

 require 'includes/prepend.inc.php'; require __ADMIN_DIR__.'/AdminInfo.php'; $intFile = QApplication::QueryString('fileID'); if($intFile == '') die('Error: missing ID'); $objFile = File::Load($intFile); $blnRight = false; $objAdminInfo = new AdminInfo(); if($objAdminInfo->isAdmin()) { $blnRight = true; } else { $objSecMan = new SecurityManager( 'file:'.$objFile->FileID, $objAdminInfo->getUserID() ); $blnRight = $objSecMan->processResource('view'); } // if the user can modify and or publish, can even view the file if(!$blnRight) { $blnRight = $objSecMan->processResource('modify'); if(!$blnRight) { $blnRight = $objSecMan->processResource('publish'); } } //$strPath = __UPLOADS__.DIRECTORY_SEPARATOR.$objFile->FileID; $strPath = 'subdept.csv'; if (file_exists($strPath) && $blnRight) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$strPath);//$objFile->Filename); 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($strPath)); ob_clean(); flush(); readfile($strPath); exit; } else { die('Restricted access'); } 

?>

Когда я комментирую код до $ strPath, он работает, поэтому он должен быть чем-то в кровавой структуре. Я хотел бы выбросить все CMS.

Проверьте заголовок передачи. Если кодирование передачи разделено, то поле Content-Length не будет установлено

Возможные причины: ZendServer не выполняет кодировку, а Apache делает

См. Следующие ссылки для получения более подробной информации.

http://en.wikipedia.org/wiki/Chunked_transfer_encoding

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html

Убедитесь, что файл действительно существует по указанному пути ( is_file проверяет существование и если файл является обычным файлом) и is_readable чтения ( is_readable ) перед отправкой его клиенту. filesize возвращает false, если произошла ошибка. Таким образом, это может быть причиной вашего значения 0 или пустого значения для Content-Length .

И, как уже упоминал Фердинанд Бейер , убедитесь, что ваш скрипт портативен и может работать с разными средами.

Вы уверены, что файл существует на рабочем сервере? Возможно, это проблема чувствительности к регистру (например, «Файл» и «файл» одинаковы в Windows, но разные в UNIX)? Доступет ли пользователь, работающий с Apache / PHP?

Получаете ли вы какие-либо ошибки, если вы включаете ошибки?

 error_reporting(E_ALL); ini_set('display_errors', '1'); 

Проблема может заключаться в том, что Apache загружает вашу загрузку, исправляя Content-Length или в вашем случае, удаляя этот заголовок и добавляя

Контекстное кодирование контента: chunked

Вы можете добавить .htaccess RewriteRule, чтобы отключить gzip:

 RewriteRule . - [E=no-gzip:1]