質問

私は次のようにヘッダーを設定します。

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

ZendServerと私のPC上でそれが正常に動作し、私は正しいファイルサイズでファイルをダウンロードすることができます。本番サーバーでは、ApacheでSolarisとコンパイルPHPは、私はゼロに等しいファイルサイズなので、空のファイルを使用してファイルを取得します。

configパラメータはありますか?設定することを防止することができます何か 'の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 をチェックexistanceとIFの両方の下に存在していることを確認してくださいファイルが通常のファイルである)、それをクライアントに送信する前に( is_readable の)読みやすいです。エラーが発生した場合は filesize のリターンは偽 を。だから、あなたのための0値または空の値の原因である可能性があります。のコンテンツ長

また、フェルディナント・バイエルはすでにに述べたように、作りますスクリプトは、ポータブルであり、異なる環境に対応できることを確認します。

あなたは、ファイルが運用サーバー上に存在しますか?多分それは(Windows上で同じですが、UNIX上の異なる例えば、「ファイル」と「ファイル」)大文字と小文字の区別の問題ですか? Apacheの/ PHPを実行しているユーザーが読み取りアクセス権を持っていますか?

あなたがエラーを有効にする場合は、すべてのエラーを取得するのですか?

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

問題は、Apacheは、あなたのダウンロードをgzippingのContent-Lengthを修正するの世話をして、またはあなたの場合には、そのヘッダを削除し、追加されている可能性があります。

  

コンテンツ・エンコード:チャンク

あなたはGZIPを無効にする.htaccessののRewriteRuleを追加することができます:

RewriteRule . - [E=no-gzip:1]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top