2011-01-22 16 views
1

PHPでURLをダウンロードするためのさまざまなオプションがありますが、残念です。コンテンツ範囲がPHPで送信されたときのURLデータの取得

私は知っているものすべてを調べましたが、部分コンテンツのヘッダーには注意を払っていないようです。

私は次のヘッダーを与えるURLを取得しようとしている: HTTP/1.1 206部分コンテンツ のContent-範囲:バイト0から100000/631723

をあなたがそれにファイルを料理を見ることができるように100,000バイトのチャンク。

PHPで何らかのメソッド(file_get_contents、fopen、さらにはcURL)を使用すると、最初の100,000バイトを受け取った後もこれらのどれも継続しません。

最終結果、100,000バイトのファイルがあります。

私が必要とするのは、上記の例では、すべてのデータを取得するPHPスクリプトを取得することです。すべて631,723バイトです。

どうすればいいですか?

答えて

0

あなたは206部分コンテンツ応答を取得している場合は、あなたが必見リクエストに必要な範囲を示すRangeヘッダフィールドが含まれている:

例えば

GET /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1 
Host: farm3.static.flickr.com 
Range: bytes=0-999 

または範囲のシリーズにリクエストを壊しているどこかのプロキシが解決したよう

EDIT

が要求しています、あなたが使用して一連の要求を送信しようとする場合があります範囲を取得し、あなたはそれぞれの応答に

EDIT 2

を得るのようにすべてを一緒にステッチ

リクエストを破棄して一連の応答を受け取るプロキシがある場合は、おそらく最初のものしか処理していません。 CURLOPT_WRITEFUNCTIONを使用して、各データ応答が受信されるたびに呼び出されるコールバックを登録し、さまざまなチャンクをまとめてスティッチバックを管理することができます。

+0

file_get_contentsなどはそれを送信しないのですか? 私はコード内のどこにでも範囲ヘッダを明示的に持っていません。私はサーバーがヘッダーに関係なくこれらのヘッダーを整理するこのように設定されていると思います。 – Edward

+0

要求が範囲を指定していないときにサーバーがそれを行うように設定されている場合、RFC 2616 –

+0

に違反しています。このようにする必要はないと思っていましたが、強制されるようです。ありがとうございました – Edward

0

HTTP/1.0で送信してください。コンテンツ範囲のリクエスト(および他のキャッシングとプロキシのtohuwabohu)は定義されていません。したがって、完全なファイルを確実に受け取ることができます。

file_get_contentsを使用する場合は、stream_context_create()protocol_versionパラメータを設定します。

+0

提案をありがとう。file_get_contentsとcURLとCURLOPT_HTTP_VERSIONオプションの両方を使用するだけで、これを行えます。どちらもまだ内容範囲を戻します。私はサーバーが私の言うようにそれを皿洗いするように設定されていると思う。 範囲を送信しようとしましたが、不正な範囲が返されます。 IEはデフォルトで100,000バイト単位で料理します。バイト125000-160000を要求すると100001-200001が送信されます! – Edward

+0

@Edward:かなり粗悪な実装のようです。しかし明らかに、あなたは手動ルートに行く必要があります。 – mario

+0

それほど下位互換性のために。 –