Content-Range HTTP 下载文件
2014-12-19 14:59
288 查看
Content-Range
实体头.用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range: bytes (unitSPfirst byte pos) - [last byte pos]/[entity legth]
一般向服务器请求 Range:(unitSPfirst byte pos)-[last byte pos] 服务器才会向客户返回这个头
如向服务器 GET
008-02-21 05:49:47 GET /file.rar HTTP/1.1
2008-02-21 05:49:47 Connection: close
2008-02-21 05:49:47 Host: 116.1.219.219
2008-02-21 05:49:47 Range: bytes=100-300 //意思是下载file.rar的100到300这部分数据
一般正常回应
2008-02-21 05:49:47 Content-Length: 200 //300-200=100,就是要下载的大小
2008-02-21 05:49:47 Content-Type: application/octet-stream
2008-02-21 05:49:47 Content-Range: bytes 123-456/801 //801:文件总大小+1(一般都+1的,我在研究ing)
请求下载整个文件:
GET /file.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
一般正常回应
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: bytes 0-800/801 //801:就是文件总大小,位置是0开始的,而不是从1!!!我的错误所在
另一解释
假设你要开发一个多线程下载工具,你会自然的想到把文件分割成多个部分,比如4个部分,然后创建4个线程,每个线程负责下载一个部分,如果文件大小为 403个byte,那么你的分割方式可以为:0-99 (前100个字节),100-199(第二个100字节),200-299(第三个100字节),300-402(最后103个字节)。
分割完成,每个线程都明白自己的任务,比如线程3的任务是负责下载200-299这部分文件,现在的问题是:线程3发送一个什么样的请求报文,才能够保证只请求文件的200-299字节,而不会干扰其他线程的任务。这时,我们可以使用HTTP1.1的Range头。Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的:
表示头500个字节:Range:
bytes=0-499
表示第二个500字节:Range:
bytes=500-999
表示最后500个字节:Range:
bytes=-500
表示500字节以后的范围:Range:
bytes=500-
第一个和最后一个字节:Range:
bytes=0-0,-1
同时指定几个范围:Range:
bytes=500-600,601-999
所以,线程3发送的请求报文必须有这一行:
Range: bytes=200-299
服务器接收到线程3的请求报文,发现这是一个带有Range头的GET请求,如果一切正常,服务器的响应报文会有下面这行:
HTTP/1.1 206 OK
表示处理请求成功,响应报文还有这一行
Content-Range: bytes 200-299/403
斜杠后面的403表示文件的大小,通常Content-Range的用法为:
. The first 500 bytes:
Content-Range: bytes
0-499/1234
. The second 500 bytes:
Content-Range: bytes 500-999/1234
. All except for the first 500 bytes:
Content-Range: bytes 500-1233/1234
. The last 500 bytes:
Content-Range: bytes 734-1233/1234
好了就先这样,等我做完多线程下载器在来完善!
转载自:http://www.91linux.com/html/article/program/cpp/20090411/16420.html
http://www.cnblogs.com/happyhotty/articles/2056812.html
实体头.用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range: bytes (unitSPfirst byte pos) - [last byte pos]/[entity legth]
一般向服务器请求 Range:(unitSPfirst byte pos)-[last byte pos] 服务器才会向客户返回这个头
如向服务器 GET
008-02-21 05:49:47 GET /file.rar HTTP/1.1
2008-02-21 05:49:47 Connection: close
2008-02-21 05:49:47 Host: 116.1.219.219
2008-02-21 05:49:47 Range: bytes=100-300 //意思是下载file.rar的100到300这部分数据
一般正常回应
2008-02-21 05:49:47 Content-Length: 200 //300-200=100,就是要下载的大小
2008-02-21 05:49:47 Content-Type: application/octet-stream
2008-02-21 05:49:47 Content-Range: bytes 123-456/801 //801:文件总大小+1(一般都+1的,我在研究ing)
请求下载整个文件:
GET /file.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
一般正常回应
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: bytes 0-800/801 //801:就是文件总大小,位置是0开始的,而不是从1!!!我的错误所在
另一解释
假设你要开发一个多线程下载工具,你会自然的想到把文件分割成多个部分,比如4个部分,然后创建4个线程,每个线程负责下载一个部分,如果文件大小为 403个byte,那么你的分割方式可以为:0-99 (前100个字节),100-199(第二个100字节),200-299(第三个100字节),300-402(最后103个字节)。
分割完成,每个线程都明白自己的任务,比如线程3的任务是负责下载200-299这部分文件,现在的问题是:线程3发送一个什么样的请求报文,才能够保证只请求文件的200-299字节,而不会干扰其他线程的任务。这时,我们可以使用HTTP1.1的Range头。Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的:
表示头500个字节:Range:
bytes=0-499
表示第二个500字节:Range:
bytes=500-999
表示最后500个字节:Range:
bytes=-500
表示500字节以后的范围:Range:
bytes=500-
第一个和最后一个字节:Range:
bytes=0-0,-1
同时指定几个范围:Range:
bytes=500-600,601-999
所以,线程3发送的请求报文必须有这一行:
Range: bytes=200-299
服务器接收到线程3的请求报文,发现这是一个带有Range头的GET请求,如果一切正常,服务器的响应报文会有下面这行:
HTTP/1.1 206 OK
表示处理请求成功,响应报文还有这一行
Content-Range: bytes 200-299/403
斜杠后面的403表示文件的大小,通常Content-Range的用法为:
. The first 500 bytes:
Content-Range: bytes
0-499/1234
. The second 500 bytes:
Content-Range: bytes 500-999/1234
. All except for the first 500 bytes:
Content-Range: bytes 500-1233/1234
. The last 500 bytes:
Content-Range: bytes 734-1233/1234
好了就先这样,等我做完多线程下载器在来完善!
转载自:http://www.91linux.com/html/article/program/cpp/20090411/16420.html
http://www.cnblogs.com/happyhotty/articles/2056812.html
相关文章推荐
- Content-Range HTTP 下载文件原理
- 正确处理下载文件时HTTP头的编码问题(Content-Disposition)
- 下载网络文件HttpURLConnection.getContentLength()大小为 -1
- 下载网络文件HttpURLConnection.getContentLength()大小为 -1
- NET(C#):使用HttpWebRequest头中的Range下载文件片段
- (4.3.2.14)下载网络文件HttpURLConnection.getContentLength()大小为 -1
- 自定义文件下载支持断点续传(HTTP_RANGE Adodb.Stream)
- NET(C#):使用HttpWebRequest头中的Range下载文件片段
- 下载网络文件HttpURLConnection.getContentLength()大小为 0
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- 下载网络文件HttpURLConnection.getContentLength()大小为 0
- 下载网络文件HttpURLConnection.getContentLength()大小为
- 利用response和HttP中的Content-Disposition: attachment; filename=aaa.zip响应头,实现简单的文件下载
- 下载网络文件HttpURLConnection.getContentLength()大小为 -1
- 关于inputStream.available()与HttpURLConnection.getContentLength()方法获取下载文件的大小
- 转载: 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- NET(C#):使用HttpWebRequest头中的Range下载文件片段
- HTTP下载文件时getContentLength()返回-1
- Retrofit文件上传与下载(xjh 这应该是retrofit1的代码 亲测不行)___http://www.ithao123.cn/content-7813575.html
- 关于inputStream.available()与HttpURLConnection.getContentLength()方法获取下载文件的大小