2

我通过以下方式设置标题:

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

在我的带有 ZendServer 的 PC 上,它工作正常,我可以下载具有正确文件大小的文件。在生产服务器上,一个带有 Apache 和编译 PHP 的 Solaris,我得到一个文件大小为零的文件,所以是一个空文件。

有配置参数吗?可以阻止设置“内容长度: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。

4

5 回答 5

5

检查传输编码标头。如果传输编码被分块,则不会设置 Content-Length 字段

可能的原因是 ZendServer 不做分块编码,而 Apache 做

有关详细信息,请参阅以下链接

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

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

于 2009-08-26T14:02:54.863 回答
2

确保文件在指定路径下确实存在(is_file检查是否存在以及文件是否为常规文件)并且is_readable在将其发送到客户端之前可读()。如果发生错误,则filesize返回false 。所以这可能是Content-Length的 0 值或空值的原因。

而且,正如Ferdinand Beyer 已经提到的,确保您的脚本是可移植的并且可以处理不同的环境。

于 2009-08-26T13:03:53.370 回答
0

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

于 2009-08-26T12:58:14.320 回答
0

如果启用错误,您会收到任何错误吗?

error_reporting(E_ALL);
ini_set('display_errors', '1');
于 2009-08-26T13:05:51.980 回答
0

一个问题可能是 Apache 正在压缩您的下载,负责更正 Content-Length,或者在您的情况下,删除该标头并添加

内容编码:分块

您可以添加一个.htaccessRewriteRule 来禁用 gzip:

RewriteRule . - [E=no-gzip:1]
于 2012-12-12T11:23:26.313 回答