原理:
http协议中的断电续传是基于HTTP头Range以及Content-Range。
HTTP头中一般断点下载时才用到Range和Content-Range实体头,Range用户请求头中,指定第一个字节的位置和最后一个字节的位置(eg:Range:200-300或Range:200-);
Content-Range用于响应头。通俗的来讲就是文件大小为10,这次下载了3,被中断了,下次继续下载时将指针移动到3的位置,从3开始下载,最终将整个文件下载下来。
简单http下载文件
请求下载整个文件:
GET /test.rar HTTP/1.1
Connection:close
Host:192.168.95.11
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:文件中大小
重要的几个头:
响应头:
Content-type:告诉浏览器文件的MIME类型,非常重要,MIME种类繁多。很可能程序中漏掉一些MIME类型,表示全部为content-type:application/otet-stream(字节流)
Content-disposition:是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。当Internet Explorer接收到头时,他会激活文件下载对话框。它的文件名框自动填充了头中制定的文件名。(就是激活弹出提示下载框)。一般这样写:content-disposition:attachment;filename=name
Content-Length:告诉浏览器这个文件的大小,不设置这个头,浏览器也会自己识别。
Pragma Cache-control:把这两个头设置为public – 告诉浏览器缓存 – 一般设置cache-control:public
Content-Range:字段说明服务器返回了文件的某个范围及文件的总长度。这时Content-Length字段就不是整个文件的大小,而是对应文件这个范围的字节数。一般格式 – Content-Range:bytes 500-999/1000
响应头:
Range:可以请求实体的一个或多个子范围
eg:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500- 【下载断点续传(一般range格式为500-)】
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(Partial Content)返回而不是以200(OK)。【206表示服务器已经完成GET的部分请求,即表示断点续传】