Заголовок Content-Length всегда равен нулю
-
20-09-2019 - |
Вопрос
Я установил заголовок следующим образом:
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 делает это.
Подробности смотрите по следующим ссылкам
Другие советы
Убедитесь, что файл действительно существует по указанному пути (is_file
проверяет как существование, так и то, является ли файл обычным файлом) и доступен ли он для чтения (is_readable
) перед отправкой клиенту. filesize
возвращает ЛОЖЬ если произошла ошибка.Так что это может быть причиной вашего значения 0 или пустого значения для Длина контента.
И в качестве Фердинанд Бейер уже упоминался, убедитесь, что ваш скрипт переносим и может работать в различных средах.
Вы уверены, что файл существует на рабочем сервере?Может быть, это проблема с чувствительностью к регистру (например, «Файл» и «файл» одинаковы в Windows, но разные в UNIX)?Имеет ли пользователь, использующий Apache/PHP, доступ на чтение?
Появятся ли какие-либо ошибки, если вы включите ошибки?
error_reporting(E_ALL);
ini_set('display_errors', '1');
Проблема может заключаться в том, что Apache сжимает вашу загрузку, исправляя длину содержимого или, в вашем случае, удаляя этот заголовок и добавляя
Кодирование контента:куски
Вы можете добавить .htaccess
RewriteRule для отключения gzip:
RewriteRule . - [E=no-gzip:1]