3

cURLを使用してファイルの最後の1MBのデータを取得することは可能ですか?最初のMBを取得できることはわかっていますが、最後のMBが必要です。

4

2 に答える 2

4

はい、リクエストでHTTPRangeヘッダーを指定することでこれを行うことができます。

// $curl = curl_init(...);
$lower = $size - 1024 * 1024;
$upper = $size;
url_setopt($curl, CURLOPT_HTTPHEADER, array("Range: bytes=$lower-$upper"));

注:データを要求しているサーバーがこれを許可していることを確認する必要があります。リクエストを行い、ヘッダーHEADを確認します。Accept-Ranges

ニーズに合わせて微調整できるはずの例を次に示します。

// Make HEAD request
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl);

preg_match('/^Content-Length: (\d+)/m', $data, $matches);
$size = (int) $matches[1];
$lower = $size - 1024 * 1024;

// Get last MB of data
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_HTTPGET, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Range: bytes=$lower-$size"));

$data = curl_exec($curl);
于 2012-12-11T16:23:14.387 に答える
0

これは古い質問ですが、上限範囲のみを指定することで実行できます。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Get the last 100 bytes and echo the results
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=-100"));
echo htmlentities(curl_exec($ch)) . "<br /><br />";

// Get the last 200 bytes and echo the results
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=-200"));
echo htmlentities(curl_exec($ch));

これは次を返します:

100 bytes: <p><a href="http://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> 

200 bytes: ou may use this domain in examples without prior coordination or asking for permission.</p> <p><a href="http://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>

RFC 2616から:

last-byte-posを選択することにより、クライアントはエンティティのサイズを知らなくても取得されるバイト数を制限できます。

于 2017-04-09T13:57:00.010 に答える