本文主要介绍如何通过HTTP Range请求分段获取OSS资源。
上传或者下载OSS中的大文件(超过100M)时,如果传输过程中受到网络环境影响,则会传输失败。在上传过程中,可以调用
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]指请求资源的范围,单位为“Byte(字节)”。示例如下。
Range: bytes=0-499
表示第0~499字节范围的内容。
Range: bytes=500-999
表示第500~999字节范围的内容。
Range: bytes=-500
表示最后500字节的内容。
Range: bytes=500-
表示从第500字节开始到文件结束部分的内容。
Range: bytes=0-
表示第一个字节到最后一个字节,即完整的文件内容。
OSS不支持多Range参数,即不支持指定多个范围。如果指定多个范围,OSS只返回第一个Range的数据,例如:
Range:bytes=0-499,500-999
,OSS只返回0-499字节范围的内容。
[$ByteRange]有效区间在0至
content-length - 1
的范围内。
如果HTTP Range请求合法,响应返回值为
206
并在响应头中包含
Content-Range
。如果HTTP Range请求不合法,或者指定范围不在有效区间,会导致Range不生效,响应返回值为
200
,并传送整个Object内容。如下为HTTP Range请求不合法的示例及错误说明。
说明
:此处假设Object资源大小为1000字节,Range有效区间为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的行为。行为改变的示例如下:
说明
:此处假设Object资源大小为1000字节,Range有效区间为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请求示例。
说明
:此处假设Object资源大小为1000字节,Range有效区间为0-999。
正常请求示例
请求Object资源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: 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字节到文件结尾的内容。
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字节的内容。
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]
超出范围的请求示例
末字节1000超出有效区间,导致Range不生效,响应返回值为
200
,并传送整个Object内容。
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]
指定范围超出有效区间,导致Range不生效,响应返回值为
200
,并传送整个Object内容。
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
请求头,末字节超出有效区间,返回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 bytes of object data]
增加
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 bytes of object data]
对象存储 OSS