2012-02-20 8 views
0

私はPHPでリダイレクトすることなく、この例のように、ファイルのソースを読まずにファイルをダウンロードさせるためにどのように解決策を求めている:私は、ダウンロードを行うfile_get_contents witoutダウンロードのためのソリューションを必要としPHPヘッダファイルのパス

if(1 == 1) 
{ 
    header("Content-Type: application/xml"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Cache-Control: private",false); 
    header("Content-Disposition: attachment; filename=example.xml;");  
    $file = file_get_contents("file.ext"); 
    echo file; 
} 

mod_rewriteのように。

あなたがPHPをまっすぐに出力うち、代わりのreadfile

EDIT

とVARにファイルを送ることができますおかげ

+0

リダイレクトせずに、リードファイルsource'なし 'PHPのダウンロードファイル - それは – zerkms

+1

@zerkms、ノーそのことは不可能である。mod_xsendfile – Petah

+0

@Petah:それは非常に興味深いですが、なぜ'ヘッダ( "プラグマはあなたに – zerkms

答えて

3

あなたはXのファイル送信モジュールhttps://tn123.org/mod_xsendfile/

mod_xsendfileでのApacheを使用することができますが、X-SENDFILEに元の出力ハンドラによって登録 ヘッダを処理し、小さなApache2のモジュールです。

そのようなヘッダの存在を検出した場合、それはすべての 出力を破棄し、設定されている場合代わりに、キャッシュ・ヘッダおよび のsendfileまたはMMAPのようなすべての最適化を含むアパッチ 内部を使用して、そのヘッダで指定されたファイルを送信します。

たとえば、スクリプト出力を処理するのに便利です。 php、perlまたは任意の cgiです。

+0

こんにちは、私の質問にお答えします。このモジュールを使用してください。私はそれが隠しが必要です。 – user533178

+0

@ user533178リンクをクライアントに送信しないでください。 PHPでヘッダーを送信すると、Apacheが自動的にダウンロードをリダイレクトします。 – Petah

+0

ありがとうございましたこれは非常に良い解決策です – user533178

0

私が読んで、パススルーする代わりに推薦します出力を開始する前にファイル全体を読み取る必要がないため、パフォーマンスが向上するはずです。

if ($f = fopen($file, 'rb')) { 
    while(!feof($f) and (connection_status()==0)) { 
     print(fread($f, 1024*8)); 
     flush(); 
    } 
    fclose($f); 
} 
1
header("Pragma: public"); 
header("Content-Type: application/xml"); 
header("Cache-Control: private",false); 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=file.ext;");  
readfile("file.ext"); 
+0

に感謝:パブリック ");'必須? – Umbrella

+0

ここで読むことができます:) [http://stackoverflow.com/questions/1920781/what-does-the-http-header-pragma-public-mean](http://stackoverflow.com/questions/1920781/what -does-the-http-header-pragma-public-mean) – Fredy

+0

これには要件が記述されていません。 – Umbrella