2011-12-15 12 views
2

私はUbuntuの/ tmpフォルダからzipファイルをダウンロードしようとしています。しかし、私はPHPコードを実行すると、ダウンロードボックスを表示する代わりに、ブラウザにガベージテキストが表示されます。私はシンプルなテキストファイルを試してみましたが、私にダウンロードダイアログボックスを表示する代わりに、その内容をブラウザに表示しました。なぜこの強制ダウンロードが機能しないのか以下はコードです。php force downloadは画面にゴミを表示します

if (file_exists($dir.$filename)) { 
      header("Content-type: application/force-download"); 
      header("Content-Transfer-Encoding: Binary"); 
      header("Content-length: ".filesize($dir.$filename)); 
      header('Content-disposition: attachment; filename='.basename($dir.$filename)); 
      readfile($dir.$filename); 
      exit(0); 
     } 

    `  
+0

**可能な解決策:http://stackoverflow.com/questions/15123809/force-download-only-displays-in-browser-doesnt-prompt-for-download#answer-22228190** – gibberish

答えて

4

ブラウザのMIMEタイプが「application/force-download」の場合、ブラウザはその処理方法を知らないでしょう。

これはzipファイルなので、MIMEタイプは "application/octet-stream"または "application/zip"にする必要があります。

if (file_exists($dir . $filename)) { 
     header("Content-type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-length: " . filesize($dir . $filename)); 
     header('Content-disposition: attachment; filename=' . basename($dir . $filename)); 
     readfile($dir . $filename); 
     exit(0); 
    } 
+0

ありがとうございます!しかし、画面にはまだガベージ出力が表示されます。 – Shehroz

+5

ファイルをストリーミングする前に何かをブラウザにエコーしていますか(空白など)? –

+0

あなたは絶対に正しいです@マーク – Shehroz

0

ファイル全体をメモリに読み込むことはできません。あなたのreadfileを変更してください($ _REQUEST ['file']); :

$handle=fopen($_REQUEST['file'], 'rb'); 
while (!feof($handle)) 
{ 
    echo fread($handle, 8192); 
    flush(); 
} 
fclose($handle); 

そして、これは、ファイルの8キロバイトを読み込みます、それをクライアントにプッシュして、(それが一度にファイル全体を読んでいないとして)ように...それはない多くのメモリを消費します。

また、強制ダウンロードを常に使用する場合は、application/octet-streamを使用すると、バイナリファイルが正しく送信されます。

関連する問題