2012-06-24 3 views
6

私はバイナリファイルを取得するためにPHPでデータベースクエリを使用しています。しかし、私がダウンロードを強制しようとすると、ヘッダー( 'Content-type:application/octet-stream')行が0バイトのファイルを生成します。その行がなければ、完全な内容のファイルをダウンロードできます。バイナリファイルなので、なぜその行が問題を引き起こすのか分かりません。 コード:header( 'Content-type:application/octet-stream')は0バイトのファイルを発生させます

$result = mysql_query("SELECT data FROM stored_file WHERE file_name = '$q'"); 

while($row = mysql_fetch_array($result)) 
{ 
    $file = $row['data']; 
} 


    header('Content-disposition: attachment; filename='.$q); 
    header('Content-type: application/octet-stream'); 
    header('Content-Length: '.filesize($file)); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    echo $file; 

ご存知ですか?ありがとう。

+2

すべてのヘッダーをコメントアウトします。エラー報告を有効にしてスクリプトを実行します。エラーメッセージを投稿してください。 –

+0

エラーメッセージは表示されません。 – Akos

+0

filesize($ file)は何も返しません。 – Akos

答えて

5

filesize()は意味のある値を返しません。

最初のパラメータとして必要に応じて、ない実際のファイル名$fileでバイナリデータを持っている。したがって、エラーが発生します。 (error_reportingを有効にしてください!エラーが表示されず、2つの異なることはありません)

strlen($file)ではなく、filesize()です。

Btw、application/octet-streamまたはその他のフィルインでは、ダウンロードを強制することはありません。その効果に最も重要なのはContent-Disposition:ヘッダーです。それでも、正しいMIMEタイプを送信することは許可されています。

+0

ありがとう! Content-Lengthヘッダーを使用することは重要ですか? エラー報告について私はそれをphp.iniとコードの中で有効にした: ini_set( 'display_errors'、1); error_reporting(E_ALL); なぜ私はエラーメッセージを受け取っていないのか分かりません。 – Akos

+0

最後の手段として、スクリプトの上に 'set_error_handler(" var_dump ");を実行してみてください。 Content-Length:ヘッダーは広くセカンダリと見なされますが、通常は動作しません。ペイロードのメタデータは、WebサーバーのようにRange:ヘッダーなども実装している場合にのみ必要です。 – mario

1

クエリを見ると、私は$row['data']がバイナリデータを保存していると思います。正しいContent-Lengthヘッダーを設定するには、mb_strlen($row['data']);を使用する必要があります。マシン上でマルチバイトサポート(mb_関数)が有効になっていない場合は、strlen()を使用してください。しかし、バイナリデータには実際にEOFバイトシーケンスが含まれていて、長さが短すぎることがあるため、結果が悪い結果になる可能性があることに注意してください。 mb_strlen関数を使用すると、セーブ側になります。

関連する問題