如何通过HTTP Range请求分段获取OSS资源

说明

本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

概述

本文主要介绍如何通过HTTP Range请求分段获取OSS资源。

详细信息

上传或者下载OSS中的大文件(超过100 MB)时,如果传输过程中受到网络环境影响,则会传输失败。在上传过程中,可以调用UploadPart进行分片上传。而下载资源时,可以通过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]有效区间在0content-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