HTTP分段下载
现代WEB服务器都支持大文件分段下载,加快下载速度,判断WEB服务器是否支持分段下载通过返回头是否有 Accept-Ranges: bytes 字段.分段下载分为两种,一种就是一次请求一个分段,一种就是一次请求多个分段。下面会一一讲解。
请求分段中的一部分
请求头部添加如下字段,0-1024代表文件最前面的1025个字节
Range: bytes=0-1024
Range字段支持的写法
Range: bytes=0-1024 获取最前面1025个字节
Range: bytes=-500 获取最后500个字节
Range: bytes=1025- 获取从1025开始到文件末尾所有的字节
Range: 0-0 获取第一个字节
Range: -1 获取最后一个字节
请求成功后服务器会返回状态码206, 并返回如下字段指示返回结果, 0-1024指示返回分段范围, 7877指示文件总大小
Content-Range: bytes 0-1024/7877
下面是用curl请求百度首页图片前面1025个字节的示例, 可以看到返回长度1025.
请求命令
curl -v --header Range:bytes=0-1024 "http://www.baidu.com/img/bd_logo1.png"
请求头部
GET /img/bd_logo1.png HTTP/1.1
User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: www.baidu.com
Accept: */*
Range:bytes=0-1024
返回头部
HTTP/1.0 206 Partial Content
Date: Sun, 06 Sep 2015 07:49:07 GMT
Server: Apache
Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
ETag: "1ec5-502264e2ae4c0"
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Expires: Wed, 03 Sep 2025 07:49:07 GMT
Content-Type: image/png
Content-Range: bytes 0-1024/7877
Content-Length: 1025
Age: 989
请求分段中的多个部分
请求头部Range字段需要添加多个范围
Range: bytes=0-1024,2000-3000
请求成功后同样返回状态码206, 返回的Content-Type字段和请求一部分时不一样, 其中multipart/byteranges;指示返回的多段请求类型, boundary指示多段内容之间的分割符
Content-Type: multipart/byteranges; boundary="Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222"
同样我们以请求百度首页logo图片为例
请求命令
curl -v --header Range:bytes=0-1024,2000-3000 "http://www.baidu.com/img/bd_logo1.png"
请求头部
GET /img/bd_logo1.png HTTP/1.1
User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: www.baidu.com
Accept: */*
Range:bytes=0-1024,2000-3000
返回头部
HTTP/1.0 206 Partial Content
Date: Sun, 06 Sep 2015 07:49:07 GMT
Server: Apache
Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
ETag: "1ec5-502264e2ae4c0"
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Expires: Wed, 03 Sep 2025 07:49:07 GMT
Content-Type: multipart/byteranges; boundary="Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222"
Content-Length: 2339
Age: 724
返回内容
--Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222
Content-Type: image/png
Content-Range: bytes 0-1024/7877
xxxx前面1025字节内容xxxxx
--Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222
Content-Type: image/png
Content-Range: bytes 2000-3000/7877
xxxx2000-3000中间1001个字节内容字节内容xxxxx
--Lusca/LUSCA_HEAD-r14809:4F1BDE32A109AC4345453D6C95A71222--
可以看到每段内容包含Content-Type和Content-Range字段, --boundary 表示内容分段, --boundar-- 表示内容结束.如果请求的Range字段范围超出了文件大小, 则服务器返回406错误码.
HTTP分段下载的更多相关文章
- NGINX(七)分段下载
前言 nginx分段下载通过ngx_http_range_filter_module模块进行处理,关于HTTP分段下载过程,可以参考HTTP分段下载一文,主要分为一次请求一段和一次请求多段 涉及数据结 ...
- 多线程分段下载研究的python实现(一)
我一直对下载文件比较感兴趣.现在我下载文件大部分是用迅雷,但迅雷也有一些不如意的地方,内存占用大,一些不必要的功能太多,不可定制.尤其是最后一点.现在有些下载对useragent,cookie,aut ...
- 前端js怎么实现大文件G级的断点续传(分块上传)和分段下载
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- .Net Core 实现 自定义Http的Range输出实现断点续传或者分段下载
一.Http的Range请求头,结合相应头Accept-Ranges.Content-Range 可以实现如下功能: 1.断点续传.用于下载文件被中断后,继续下载. 2.大文件指定区块下载,如视频.音 ...
- iOS 简单的分段下载文件
首先自己写个请求数据的类 首先.h文件 #import <Foundation/Foundation.h> @interface Downloaders : NSObject<NSU ...
- java http 分段下载
http://www.iteye.com/topic/1136815 http://www.iteye.com/topic/1128336 http://blog.chinaunix.net/uid- ...
- 数据流分段下载(Http之 Range)
public FileStreamResult StreamUploadedSongs(int id) { byte[] song = db.UploadedSongs.Where(x => x ...
- iOS开发之文件(分段)下载
1.HTTP HEAD方法 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 t ...
- Java多线程断点下载
public static class DownloadThread extends Thread{ private int threadId; private int startIndex; pri ...
随机推荐
- 简单易用的Rest
今天碰巧,用到了淘宝的在线IP地址查询的Rest API,它提供接口给用户查询IP地址的归宿地.数据库比较庞大,准确性也比较高.地址为:http://ip.taobao.com/instruction ...
- vertical-align:middle图片或者按钮垂直居中
<img>或者button按钮 垂直不对齐,加上vertical-align:middle,就能垂直对齐,常用于水平布局的验证码图片 或者按钮 也适用于 text和button在一起也会不 ...
- [转] Js获取 本周、本月、本季度、本年、上月、上周、上季度、去年时间段
/** * 针对时间的工具类 */ var DateTimeUtil = function () { /*** * 获得当前时间 */ this.getCurrentDate = function ( ...
- 005.ClearStoredGroups方法
Delphi procedure ClearStoredGroups; 类型:procedure 可见性:protected 所在单元:System.RegularExpressionsCore 父类 ...
- leetcode 解题 String to Integer (atoi)(C&python)
//此题是easy题,比较简单,主要困难在考虑全输入的各种情况://1.开始的时候有空格等空白字符//2.开头有加减号//3.溢出(第一次写就是没有考虑到这个情况) //C代码int myAtoi(c ...
- UNICODE编码表
UNICODE简介 Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进 ...
- ASP.NET MVC Spring.NET 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- 关于github在mac 10.10上无法提交代码的解决办法---备用
接下来是正文:本文主要说明在mac 10.10版本下github无法提交代码的问题 首先如果你是一个用终端提交代码的,你可以不用看这篇文章了,这篇文章主要是用于解决github客户端提交代码的问题,此 ...
- python xlrd,xlwt 读写excel文件
python 读excel文件,需要xlrd库.下载地址:https://pypi.python.org/pypi/xlrd python 写excel文件,需要xlwt库.下载地址:https:// ...
- hadoop-streaming 配置之---参数分割
map: -D stream.map.output.field.separator=. 定义mapoutput字段的分隔符为. 用户可以自定义分隔符(除了默认的tab) -D stream.num.m ...