免責事項: このトピックには、サードパーティ製品に関する情報が含まれている場合があります。 この情報は参照用です。 Alibaba Cloud は、サードパーティ製品のパフォーマンスと信頼性、およびこれらの製品の操作によって生じる潜在的な影響について、いかなる形の保証も行いません。
概要
このトピックでは、HTTP Range リクエストを分割して OSS リソースを取得する方法について説明します。
メッセージ
Object Storage Service (OSS) からサイズの大きいオブジェクト (100 MB 超) をアップロードまたはダウンロードする際、転送がネットワーク環境の影響を受けると、転送が失敗することがあります。 アップロードでは、MultipartUpload 操作 を呼び出してマルチパートアップロードを実行できます。 リソースをダウンロードする際は、HTTP Range リクエストを使用して、サイズの大きいファイルの一部を取得できます。 例:
Get /ObjectName HTTP/1.1
Host:xxxx.oss-cn-hangzhou.aliyuncs.com
Date:Tue, 17 Nov 2015 17:27:45 GMT
Authorization: SignatureValue
Range:bytes=[$ByteRange]
注:[$ByteRange] は、リクエストするデータの範囲を示します。 単位はバイトです。 例:
Range: bytes=0-499は、先頭 500 バイトを指定します。Range: bytes=500-999は、次の 500 バイトを指定します。Range: bytes=-500は、末尾 500 バイトを指定します。Range: bytes=500-は、500 バイト目からオブジェクトの末尾までのデータを指定します。Range: bytes=0-は、先頭バイトから末尾バイトまで、つまりファイル全体の内容を示します。- GetObject リクエストでは 1 つの範囲のみを指定できます。 複数の範囲を指定した場合、OSS は最初の範囲のデータのみを返します。 たとえば、
Range: bytes=0-499,500-999を指定した場合、OSS は 0~499 バイトの範囲のデータのみを返します。 - [$ByteRange] の有効範囲は 0 から
Content-Length - 1です。
HTTP Range リクエストが有効な場合、応答としてステータスコード 206 が返され、レスポンスヘッダーに Content-Range が含まれます。 HTTP Range リクエストが無効であるか、指定された範囲が有効範囲外の場合、Range 指定は無視されます。 応答としてステータスコード 200 が返され、オブジェクト全体が転送されます。 無効な HTTP Range リクエストの例と、その説明を以下に示します。
注:オブジェクトのサイズが 1000 バイト (有効範囲 0~999) であると仮定します。 指定した Range が範囲外になるのを防ぐため、Range を指定する前に HeadObject リクエストを実行してオブジェクトサイズを取得できます。
Range: byte=0-499:形式が無効です。byteはbytesである必要があります。Range: bytes=0-1000:末尾バイトの 1000 が有効範囲を超えています。Range: bytes=1000-2000:指定された範囲が有効範囲を超えています。Range: bytes=1000-:先頭バイトが有効範囲を超えています。Range: bytes=-2000:指定された範囲が有効範囲を超えています。
次のコマンドを実行して、Range パラメーターの有効性をテストできます。
curl -r 0-100 http://xxxx.oss-cn-hangzhou.aliyuncs.com/xx.zip -o /tmp/xx1.zip -v
互換性のある動作
HTTP Range を使用する際に、リクエストヘッダー x-oss-range-behavior:standard を追加すると、指定された範囲が有効範囲外の場合の OSS の動作を変更できます。 動作の変更例は次のとおりです。
注:オブジェクトのサイズが 1000 バイト (有効範囲 0~999) であると仮定します。 たとえば、HTTP Range リクエストでサイズの大きいファイルの一部を取得する際に無効な範囲を指定すると、OSS は InvalidRange エラーコードを返します。 このエラーの解決方法については、「OSS が 416 エラーを返す」をご参照ください。 エラーの詳細は次のとおりです。
The requested range cannot be satisfied
Range: bytes=500-2000:末尾バイトが有効範囲を超えている場合、500~999 バイトが返されます。Range: bytes=1000-2000:先頭バイトが有効範囲を超えている場合、エラー416 (InvalidRange)が返されます。Range: bytes=1000-:先頭バイトが有効範囲を超えている場合、エラー416 (InvalidRange)が返されます。Range: bytes=-2000:指定された範囲が有効範囲を超えている場合、0~999 バイト、つまりファイル全体が返されます。
例
以下に HTTP Range リクエストの例を示します。
注:オブジェクトのサイズが 1000 バイト (有効範囲 0~999) であると仮定します。
通常のリクエスト
- オブジェクトリソースの 0~499 バイトの範囲のコンテンツをリクエストします。
GET /ObjectName Range: bytes=0-499 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:51:30 GMT Authorization: Signature 206 (Partial Content) Content-Length: 500 Content-Range: bytes 0-499/1000 Connection: keep-alive ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA928B227D52731327DE078 Date: Fri, 18 Oct 2019 02:51:30 GMT [500 バイトのオブジェクトデータ] - オブジェクトリソースの 500 バイト目からファイルの末尾までのコンテンツをリクエストします。
GET /ObjectName Range: bytes=500- Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:24:39 GMT Authorization: Signature 206 (Partial Content) Content-Length: 500 Content-Range: bytes 500-999/1000 ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA9307750EBE33332E3720A Date: Fri, 18 Oct 2019 03:24:39 GMT [500 バイトのオブジェクトデータ] - オブジェクトリソースの末尾 500 バイトのコンテンツをリクエストします。
GET /ObjectName Range: bytes=-500 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:23:22 GMT Authorization: Signature 206 (Partial Content) Content-Length: 500 Content-Range: bytes 500-999/1000 ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA9302A6646AC37397F7039 Date: Fri, 18 Oct 2019 03:23:22 GMT [500 バイトのオブジェクトデータ]
範囲外リクエストの例
- 末尾バイトの 1000 が有効範囲外のため、Range 指定は無視されます。 応答としてステータスコード
200が返され、オブジェクト全体が転送されます。GET /ObjectName Range: bytes=0-1000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:00:02 GMT Authorization: Signature 200 (OK) Content-Length: 1000 ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA92AB204321E36347F3E7D Date: Fri, 18 Oct 2019 03:00:02 GMT [1000 バイトのオブジェクトデータ] - 指定された範囲が有効範囲外のため、Range 指定は無視されます。 応答としてステータスコード
200が返され、オブジェクト全体が転送されます。GET /ObjectName Range: bytes=1000-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:56:24 GMT Authorization: Signature 200 (OK) Content-Length: 1000 ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA929D9CCCC823835CBE134 Date: Fri, 18 Oct 2019 02:56:25 GMT [1000 バイトのオブジェクトデータ]
互換性のある動作のリクエスト例
x-oss-range-behavior:standardリクエストヘッダーを追加すると、末尾バイトが有効範囲を超えている場合でも、有効な部分である 500~999 バイトの範囲のコンテンツが返されます。GET /ObjectName x-oss-range-behavior: standard Range: bytes=500-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 07:02:23 GMT Authorization: Signature 206 (Partial Content) Content-Length: 500 Content-Range: bytes 500-999/1000 ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA9637FB3B1C73234CC59EB Date: Fri, 18 Oct 2019 07:02:23 GMT [500 バイトのオブジェクトデータ]x-oss-range-behavior:standardリクエストヘッダーを追加すると、先頭バイトが有効範囲を超えている場合に416エラーが返されます。GET /ObjectName x-oss-range-behavior: standard Range: bytes=1000-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 07:04:23 GMT Authorization: Signature 416 (Requested Range Not Satisfiable) Content-Length: 345 X-Oss-Request-Id: 5DA963F7CEBFAA3931BF91F5 Date: Fri, 18 Oct 2019 07:04:23 GMT Content-Type: application/xml <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>InvalidRange</Code> <Message>The requested range cannot be satisfied</Message> <RequestId>5DA963F7CEBFAA3931BF91F5</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> <ActualObjectSize>1000</ActualObjectSize> <RangeRequested>bytes=1000-2000</RangeRequested> </Error>x-oss-range-behavior:standardリクエストヘッダーを追加すると、指定された範囲が有効範囲を超えている場合でも、0~999 バイト、つまりファイル全体が返されます。GET /ObjectName x-oss-range-behavior: standard Range: bytes=-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 07:06:39 GMT Authorization: Signature 206 (Partial Content) Content-Length: 1000 Content-Range: bytes 0-999/1000 ETag: "CACF99600561A31D494569C979E6FB81" X-Oss-Request-Id: 5DA9647FC4334F3534AF9A83 Date: Fri, 18 Oct 2019 07:06:39 GMT [1000 バイトのオブジェクトデータ]
適用範囲
- OSS