Заголовок 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.


person rtacconi    schedule 26.08.2009    source источник


Ответы (5)


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

Возможная причина заключается в том, что ZendServer не выполняет фрагментированное кодирование, тогда как Apache делает

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

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

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

person Prabhu R    schedule 26.08.2009
comment
Спасибо! Я получаю: Transfer-Encoding: chunked and no Content-Length. Я должен найти способ остановить сервер, чтобы это сделать. - person rtacconi; 26.08.2009
comment
Возможно, хотя и не уверен, фреймворк Zend определяет, использовать ли фрагментированное кодирование или нет. Необходимо проверить документацию - person Prabhu R; 26.08.2009

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

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

person Gumbo    schedule 26.08.2009
comment
Это не проблема разрешений, я тестирую файл с 777. Это не проблема имени файла. Файл существует, и его размер не равен 0. Я могу загрузить его, указав URI в браузере, но скрипт всегда отображает 0. - person rtacconi; 26.08.2009
comment
@rtacconi: Вы проверили фактический необработанный HTTP-заголовок ответа? - person Gumbo; 26.08.2009
comment
Нет, я подумал проверить это, но я должен найти учебник по HTTP для комментария для использования в telnet - person rtacconi; 26.08.2009
comment
Я не могу использовать веб-сниффер, потому что сайт представляет собой интрасеть, но я обнаружил, что «Live HTTP Headers» в порядке. - person rtacconi; 28.08.2009

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

person Ferdinand Beyer    schedule 26.08.2009

Получаются ли ошибки при включении ошибок?

error_reporting(E_ALL);
ini_set('display_errors', '1');
person bucabay    schedule 26.08.2009

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

Content-Encoding: по частям

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

RewriteRule . - [E=no-gzip:1]
person Paul Lammertsma    schedule 12.12.2012