2012-02-19 14 views
2

ダウンロードするファイルをブラウザが開くのを防ぐため、強制ダウンロードページを作成しようとしています。問題は、ダウンロードしたファイルが0バイトであり、したがって使用できないことです。私のコードで何が間違っていますか?強制的にPHPでダウンロードする

$file = "http://gh0stsec.zxq.net/background1.jpg"; 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=".basename($file)); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($filename)); 
header("Content-Description: File Transfer"); 
@readfile($file); 
exit(); 
+0

'application/force-download'は実際のMIMEタイプではありません。それは遅れている。それがダウンロードをトリガーするものではありません。それは 'Content-Dispositon'だけです。無効なMIMEタイプを追加することは無意味です。 – mario

答えて

3

チェック:

header("Content-Length: ".filesize($filename)); 

私はそれがあるべきだと思う:私はあなたはそれがローカルファイル(それならばありませんので、filesizeの問題を持っているつもりだと思います

header("Content-Length: ".filesize($file)); 
+0

ありがとう!すぐに解決しました。どのように私はそれを見落としたか分かりません。 –

1

は、相対パスを使用します)。 Content-Typeヘッダーは、私にとってはちょっと変わっていますが、私が読んだ例では、force-downloadは常にフォールバックでした。とにかく、私はこれを行い、うまくいったようです:

<?php 
$file = file_get_contents('http://gh0stsec.zxq.net/background1.jpg'); 

if ($file) 
{ 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=background1.jpg'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . strlen($file)); 
    ob_clean(); 
    flush(); 

    echo $file; 
} 
else 
{ 
    echo 'error'; 
} 
?>