现在的文件上传下载功能,都是支持断点续传的。那么这看似很简单的小功能,背后实现的原理是怎样的呢?

断点续传机制(文件断点续传功能的原理)(1)

断点续传支持从文件上次中断的地方开始传送数据,而并非是从文件开头传送。

断点续传的原理如下:

由于浏览器与服务端的通讯是基于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年互联网产品设计经验。擅长用户体验设计,喜欢钻研需求功能背后的技术实现方式;在成为综合型产品设计师的道路上不断努力前进!

本文原创发布于人人都是产品经理。未经许可,禁止转载

题图由作者提供

,