php - 模拟请求一张图片,请求首部包含range,但为什么返回的没有content-range字段?

 永城之家_319 发布于 2022-11-14 10:47

这是请求头

GET http://subversion.apache.org/images/windows.png HTTP/1.1
Host: subversion.apache.org
Range: 1000-3000
Content-Length: 14
Pragma: no-cache

这是响应头

HTTP/1.1 200 OK
Date: Sun, 28 Aug 2016 01:33:56 GMT
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Thu, 14 Jan 2010 21:29:52 GMT
ETag: "1403-47d2696640237"
Accept-Ranges: bytes
Content-Length: 5123
Content-Type: image/png
Cache-Control: no-cache

他直接返回了一个完整的图片,按照预想应该是返回部分图片才对

1 个回答
  • 改为Range: bytes=1000-3000即可。

    注意上面的写法你会得到共2001字节的数据,因为Range是包括头尾的

    根据RFC2616,Range标头需要写单位,格式定义如下

       ranges-specifier = byte-ranges-specifier
       byte-ranges-specifier = bytes-unit "=" byte-range-set
       byte-range-set  = 1#( byte-range-spec | suffix-byte-range-spec )
       byte-range-spec = first-byte-pos "-" [last-byte-pos]
       first-byte-pos  = 1*DIGIT
       last-byte-pos   = 1*DIGIT
    

    byte-ranges-specifier的取值例子(假定消息体完整长度为10000):

    • 开头500字节(字节偏移量0-499,包含头尾):bytes=0-499

    • 接着500字节(字节偏移量500-999,包含头尾):bytes=500-999

    • 最后500字节(字节偏移量9500-9999,包含头尾):bytes=-500或者bytes=9500-

    • 只有首字节和尾字节(第0字节和第9999字节):bytes=0-0,-1

    • 还有以下合法但不常用的接着500字节的写法(字节偏移量500-999,包含头尾):bytes=500-600,601-999bytes=500-700,601-999

    另外,为了确保分块下载的时候不会正好遇到服务器更新而下载到脏数据,你还是应该把ETag发到服务器端,或者加上 If-Range标头下载。

    2022-11-14 11:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有