2011-02-10 9 views
4

カールでリモートファイルをダウンロードしてすぐにユーザーに出力したいと考えています。 ユーザーは、リモートサーバーではなく自分のサーバーからファイルをダウンロードすると考えるべきです。一部のファイルが200 MBを超えるため、ファイル全体をバッファリングできません。また、ユーザは、ファイルのダウンロードを開始するまで、終了バッファリングを待たなければならない。カールでリモートファイルを直接ダウンロード

私は直接リモートサーバーからファイルをダウンロードするためのスクリプトを見つけました:

<?php 
$file_name = $_GET['file']; 
$file_url = 'http://www.remote.tld/' . $file_name; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url); 
exit; 
?> 

はカールとも可能直接リモートダウンロードこの種のですか?

+0

それは可能ですが、私はあなたがしたい理由がわかりません。確かに、より信頼性の高いネイティブPHP関数を使用する方が良いでしょうか? (おそらく 'allow_fopen_url'を無効にしていない限り) – lonesomeday

答えて

5

200MBファイル全体がPHPスクリプトのメモリに収まらないため、ファイルを読み込んで出力する必要があります。

curlでこれを行う方法は、this questionを参照してください。ライブの例はthe manualです。このようなものは盗まれ、修正されているはずです(テストされていない)。

<?php 
curl_setopt($this->curl_handle, CURLOPT_WRITEFUNCTION, "receiveResponse"); 

function receiveResponse($curlHandle,$data) 
    { 
         echo $data; // Ouput to the user 
         $length = strlen($data); 
         return $length; 

       } 
?> 

これはめったに良いことではありません。それはサーバに比較的重い負担をかけます。交通量がかなり高い場合は、ダウンロードに奉仕することの虚栄心を支払うのは高額です。また、もちろん、200 MBのダウンロードでトラフィックの400 MBが作成されます!

+0

こんにちは、あなたの答えとあなたのヒントに感謝します。私はカールすることなくそれを処理しようと考えています。とにかくこれは非常に面白いです。私はwrite関数を使うことができるのか知らなかった... –

0

サーバーにファイルをバッファリングせずにサーバーからファイルを配信することはできません。

逆のURLを隠すために、反対側のサーバーのDNSサーバーにアクセスできないため、CURLではなく技術的な解決方法はありません。

関連する問題