2012-03-16 15 views
2

ファイルのURLを入力するページがあり、サーバーにそのファイルをダウンロードして、サーバーのフォルダに保存します。問題は、私のサーバーにファイルをダウンロードする方法を知らないということです。私は次の両方の方法を試してみたが、どちらもうまくいかなかった。外部リンクからサーバーにリモートでファイルをダウンロードする - 途中で途中で終了する

この1つは失敗したオープンストリームに関するエラーがスローされます。

$url = 'http://www.example.com/file.zip'; 
$enc = urlencode($url); 
$dir = "/downloads/file.zip"; 
$raw = file_get_contents($enc); 
file_put_contents($dir, $raw); 

この1つは動作しますが、私は唯一の270キロバイトのファイルのうち、18キロバイトを取得:(私はタイムアウトを長くしようとした)

set_time_limit(0); 

$url = 'http://www.eample.com/file.zip'; 
$fp = fopen ('/downloads/file.zip', 'w+'); 

    $ch = curl_init($url); 

    curl_setopt_array($ch, array(
    CURLOPT_URL   => $url, 
    CURLOPT_BINARYTRANSFER => 1, 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_FILE   => $fp, 
    CURLOPT_TIMEOUT  => 50, 
    CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' 
    )); 

$results = curl_exec($ch); 
if(curl_exec($ch) === false) 
{ 
    echo 'Curl error: ' . curl_error($ch); 
} 
+0

これが問題なのかどうかはわかりませんが、これを動作させるためにユーザーエージェントを過去に一般的なものに変更しなければなりませんでした。また、使用しているURLが、実際のファイルにリダイレクトするURLでないことを確認してください。 – gpojd

+0

@gpojdあなたはどういう意味ですか?たとえば、ブラウザにURLを入力すると、サイトに移動することはありません。ダウンロードを開始するだけです。それは問題ですか? – DonJuma

+0

最後に 'curl_close($ ch);'を追加してください。 *たぶん*役立つ。またそれの後に、 'fflush($ fp);を置きます。 fclose($ fp); ' - 戻り値もチェックし、これらの関数のマニュアルを参照してください。 BTW 'CURLOPT_RETURNTRANSFER => 1、'は意味がありません。また、curlにcontent-lengthを返すように伝え、 'curl_get_info'(または同様のもの)でチェックし、ファイルのサイズと比較することができます。 – hakre

答えて

2

この1つが失敗したオープンストリームに関するエラーがスローされます。

... 
$enc = urlencode($url); 
... 

既に正しくエンコードされているURLを "urlencode"する必要がないので、私は不思議ではないと思います。試してください:

$url = 'http://www.example.com/file.zip'; 
$file = "/downloads/file.zip"; 
$src = fopen($url, 'r'); 
$dest = fopen($file, 'w'); 
echo stream_copy_to_stream($src, $dest) . " bytes copied.\n"; 

stream_copy_to_stream­Docsを参照してください。 user-agentなどのHTTPのものをさらに設定する必要がある場合は、HTTP Context Options­Docsを使用してください。

+0

これは魅力的に機能しました。私はapkファイルにつながった元のurlを通常のjpg画像に変更していました。私は他のサイトが私の要求を否定していたと思います。ありがとうございました。 – DonJuma

+0

変数を保存するために(潜在的に大きなファイル)を変数に格納する必要がないため、これはさらに優れています。ストリームのコールバックを登録して、舞台裏で何が起きているかを知ることもできます。 – hakre

+0

このシステムは、スクリプトを呼び出すために使用するネットワークの帯域幅を使用するのか、またはサーバーのネットワークから帯域幅を使用するだけですか? – DonJuma

関連する問題