如何通過HTTP Range請求分段獲取OSS資源
本文檔可能包含第三方產(chǎn)品信息,該信息僅供參考。阿里云對第三方產(chǎn)品的性能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
概述
本文主要介紹如何通過HTTP Range請求分段獲取OSS資源。
詳細信息
上傳或者下載OSS中的大文件(超過100 MB)時,如果傳輸過程中受到網(wǎng)絡(luò)環(huán)境影響,則會傳輸失敗。在上傳過程中,可以調(diào)用UploadPart進行分片上傳。而下載資源時,可以通過HTTP Range請求獲取大文件的部分內(nèi)容,示例如下。
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]指請求資源的范圍,單位為“Byte(字節(jié))”,示例如下:
Range: bytes=0-499
表示第0~499字節(jié)范圍的內(nèi)容。Range: bytes=500-999
表示第500~999字節(jié)范圍的內(nèi)容。Range: bytes=-500
表示最后500字節(jié)的內(nèi)容。Range: bytes=500-
表示從第500字節(jié)開始到文件結(jié)束部分的內(nèi)容。Range: bytes=0-
表示第一個字節(jié)到最后一個字節(jié),即完整的文件內(nèi)容。OSS不支持多Range參數(shù),即不支持指定多個范圍。如果指定多個范圍,OSS只返回第一個Range的數(shù)據(jù),例如:
Range:bytes=0-499,500-999
,OSS只返回0~499字節(jié)范圍的內(nèi)容。[$ByteRange]有效區(qū)間在0至
content-length - 1
的范圍內(nèi)。
如果HTTP Range請求合法,響應(yīng)返回值為206
并在響應(yīng)頭中包含Content-Range
。如果HTTP Range請求不合法,或者指定范圍不在有效區(qū)間,會導(dǎo)致Range不生效,響應(yīng)返回值為200
,并傳送整個Object內(nèi)容。如下為HTTP Range請求不合法的示例及錯誤說明。
此處假設(shè)Object資源大小為1000字節(jié),Range有效區(qū)間為0~999。為避免指定的Range超出范圍,可在Range讀取前進行HeadObject請求,獲取對象大小。
Range: byte=0-499
:格式錯誤,byte應(yīng)為bytes。Range: bytes=0-1000
:末字節(jié)1000超出有效區(qū)間。Range: bytes=1000-2000
:指定范圍超出有效區(qū)間。Range: bytes=1000-
:首字節(jié)超出有效區(qū)間。Range: bytes=-2000
:指定范圍超出有效區(qū)間。
可以通過如下命令測試Range參數(shù)的有效性。
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
,可以改變指定范圍不在有效區(qū)間時OSS的行為。行為改變的示例如下:
此處假設(shè)Object資源大小為1000字節(jié),Range有效區(qū)間為0~999。如通過HTTP Range請求獲取大文件的部分內(nèi)容時,因選取了無效的范圍,導(dǎo)致OSS返回InvalidRange錯誤碼,請參見OSS返回416錯誤進行解決,詳細錯誤信息如下:
The requested range cannot be satisfied
Range: bytes=500-2000
:末字節(jié)超出有效區(qū)間,返回500~999字節(jié)范圍內(nèi)容。Range: bytes=1000-2000
:首字節(jié)超出有效區(qū)間,返回錯誤416 (InvalidRange)
。Range: bytes=1000-
:首字節(jié)超出有效區(qū)間,返回錯誤416 (InvalidRange)
。Range: bytes=-2000
:指定范圍超出有效區(qū)間,返回0~999字節(jié),即完整的文件內(nèi)容。
示例
針對上述內(nèi)容,本文提供如下HTTP Range請求示例。
此處假設(shè)Object資源大小為1000字節(jié),Range有效區(qū)間為0~999。
正常請求示例
請求Object資源0~499字節(jié)范圍內(nèi)的內(nèi)容。
GET /ObjectName Range: bytes=0-499 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:51:30 GMT Authorization: Sigature 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 bytes of object data]
請求Object資源第500字節(jié)到文件結(jié)尾的內(nèi)容。
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 bytes of object data]
請求Object資源最后500字節(jié)的內(nèi)容。
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 bytes of object data]
超出范圍的請求示例
末字節(jié)1000超出有效區(qū)間,導(dǎo)致Range不生效,響應(yīng)返回值為
200
,并傳送整個Object內(nèi)容。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 bytes of object data]
指定范圍超出有效區(qū)間,導(dǎo)致Range不生效,響應(yīng)返回值為
200
,并傳送整個Object內(nèi)容。GET /ObjectName Range: bytes=1000-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:56:24 GMT Authorization: Sigature 200 (OK) content-length: 1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA929D9CCCC823835CBE134 date: Fri, 18 Oct 2019 02:56:25 GMT [1000 bytes of object data]
兼容行為請求示例
增加
x-oss-range-behavior:standard
請求頭,末字節(jié)超出有效區(qū)間,返回500~999字節(jié)范圍的內(nèi)容。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 bytes of object data]
增加
x-oss-range-behavior:standard
請求頭,首字節(jié)超出有效區(qū)間,返回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
請求頭,指定范圍超出有效區(qū)間,返回0~999字節(jié),即完整的文件內(nèi)容。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 bytes of object data]
適用于
對象存儲 OSS