Content-Length头始终为零(Content-Length header always z

2019-07-03 18:29发布

我将通过以下方式头部:

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

我与ZendServer对其进行访问PC它工作正常,我可以下载一个文件用正确的文件大小。 在生产服务器上,与Apache在Solaris和编译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路程。

Answer 1:

检查Transfer-Encoding头。 如果传输编码分块,然后内容长度字段将不被设置

可能的原因是,ZendServer对其进行访问不会做分块编码,而在Apache存在

详情请参阅以下链接

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

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



Answer 2:

确保该文件确实指定路径下存在( is_file同时检查存及其如果该文件是一个普通文件)和可读( is_readable其发送到客户端之前)。 filesize返回 ,如果发生错误。 所以这可能是您的0值或Content-Length的空值的原因。

而且,正如费迪南德拜尔已经提到的 ,请确保你的脚本是便携式的,可以处理不同的环境。



Answer 3:

你确定该文件存在在生产服务器上? 也许这是一个区分大小写的问题(例如,“文件”和“文件”是相同的Windows版本,但不同的UNIX上的)? 是否运行Apache / PHP的用户具有读取权限?



Answer 4:

你得到任何错误,如果您启用错误?

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


Answer 5:

一个问题可能是Apache正在使用gzip压缩您的下载,以修正内容长度的护理,或在您的情况下,去除头和加入

内容编码:分块

您可以添加.htaccess重写规则禁用gzip的:

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


文章来源: Content-Length header always zero