2012-02-11 15 views
3

リモートファイルをメモリに読み込まずにPHPでダウンロードすることは可能ですか?私はfpassthru()、readfile()、file_get_contents()がすべてファイルをメモリに読み込んでからブラウザに出力することを知っています。PHPはメモリに読み込まずにリモートファイルを強制的にダウンロードする

ここに私のコードです:

if($url = getRemoteFileURL($file_id)) 
{ 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="abc.zip"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Pragma: no-cache'); 

    readfile($url); // is there a better function ? 
} 

私は、ヘッダー(「場所:」)したくないあなたがダウンロードしたファイルにheader("Location: ...");をすればそれがURLに

+0

リモートファイルのチャンクされたフェッチを使用して、そのファイルを削除することができます。しかしそれはあなたのスクリプトからの複数のHTTP要求を必要とし、非常に非効率的です。 –

答えて

2

を明らかにするため、実際にURLは実際には明らかにされていません。

いずれにしても、おそらくreadfileが最適です。 PHPがファイルの一部を読み込み、それを出力し、次の部分を読むなど、メモリをほとんど使用しないで、出力に直接書き込むとすれば、私は仮定します。

+0

URLは、Inspectorを開いている人には明らかですが、時には受け入れられないこともあります。また、ファイル名を制御することはできません。 –

+0

はいアレックは正しいです。 Chromeでは、現在のダウンロードページにアクセスするだけでURLを確認できます。また、readfileは、ファイルがダウンロードされている間、スクリプトを実行させます。あまり効率的でないIMO。たとえば、1GBのファイルを30分間ダウンロードしていた場合、スクリプトは30分間実行されます(一部のサーバがそのスクリプトを実行するためにタイムアウトするかどうかわかりません) – peter

+0

デフォルトの最大PHPスクリプト実行時間は30秒です...そう、デフォルト値ではうまくいかないでしょう。 – chris342423

関連する問題