现在的文件上传下载功能,都是支持断点续传的。那么这看似很简单的小功能,背后实现的原理是怎样的呢?
断点续传支持从文件上次中断的地方开始传送数据,而并非是从文件开头传送。
断点续传的原理如下:
由于浏览器与服务端的通讯是基于HTTP协议,所以断点续传功能的原理就是靠HTTP请求来实现。
断点续传功能最核心的原理就是利用HTTP请求中的两个字段:客户端请求头中的Range,和服务端响应头的Content-Range。
我们举一个例子,模拟一下整个过程。
1、浏览器请求服务器上的一个文件时,所发出的请求如下(假设文件名为 file.zip,服务器域名为W):
- GET /file.zip HTTP/1.1 //浏览器用GET方式获取file.zip文件,HTTP协议版本1.1
- Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
- excel, application/msword, application/vnd.ms-powerpoint //可接受的响应内容(文件)类型
- Accept-Language: zh-cn //可接受的响应内容语言(简体中文)
- Accept-Encoding: gzip, deflate //可接受的响应内容的编码方式
- User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) //浏览器的身份标识(浏览器类型)
- Connection: Keep-Alive //浏览器想要优先使用的连接类型
2、服务器收到请求后,寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:
- 200 //响应状态码(200标识成功)
- Content-Length=123456789 //响应消息的长度(单位是字节)
- Accept-Ranges=bytes //服务器所支持的内容范围(字节)
- Date=Mon, 30 Apr 2001 12:56:11 GMT //此消息被发送时的日期和时间
- ETag=W/“02ca57e173c11:95b” //资源的标识符
- Content-Type=application/octet-stream //当前内容的类型
- Server=Microsoft-IIS/5.0 //服务器名称
- Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT //所请求的对象的最后修改日期
3、此时文件已经开始下载了,如果现在停止了下载,那么再次下载文件时就要从已经下载的地方继续下载。现在比如按下了继续下载,那么此时浏览器的请求内容如下:
- GET /file.zip HTTP/1.1
- Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
- excel, application/msword, application/vnd.ms-powerpoint
- Range: bytes=200000- //告诉服务器 file.zip 这个文件从200000字节开始传,前面的字节不用传了
- Accept-Language: zh-cn
- Accept-Encoding: gzip, deflate
- User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
- Connection: Keep-Alive
4、此时服务器收到这个请求后,返回的信息如下:
- 206 //表示服务器已经成功处理了部分GET请求
- Content-Length=123256789
- Content-Range=bytes 200000-/123456789 //表示已经返回了200000B的文件数据,同时也返回了文件的全部大小
- Date=Mon, 30 Apr 2001 12:55:20 GMT
- ETag=W/“02ca57e173c11:95b”
- Content-Type=application/octet-stream
- Server=Microsoft-IIS/5.0
- Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
以上就是断点续传的原理,在不同客户端实现时只需要找到不同的开发语言实现提交Range的方法即可。
作为产品功能的设计者,每一个看似简单的小功能,其背后的实现原理都值得我们去研究,正所谓“知其然,更要知其所以然”。
#专栏作家#
流年,人人都是产品经理专栏作家。互联网产品设计师,4年互联网产品设计经验。擅长用户体验设计,喜欢钻研需求功能背后的技术实现方式;在成为综合型产品设计师的道路上不断努力前进!
本文原创发布于人人都是产品经理。未经许可,禁止转载
题图由作者提供
,