如何基于SpringMVC实现断点续传(HTTP)
这篇文章主要介绍了如何基于springmvc实现断点续传(http),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、概述
所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的http协议是不支持断点的,http/1.1开始就支持了。一般断点下载时才用到range和content-range实体头。http协议本身不支持断点上传,需要自己实现。
二、range
用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始。典型格式:
- ranges: (unit=first byte pos)-[last byte pos]
- ranges: bytes=4000- 下载从第4000字节开始到文件结束部分
- ranges: bytes=0~n 下载第0-n字节范围的内容
- ranges: bytes=m-n 下载第m-n字节范围的内容
- ranges: bytes=-n 下载最后n字节内容
1.以下几点需要注意:
(1)这个数据区间是个闭合区间,起始值是0,所以“range: bytes=0-1”这样一个请求实际上是在请求开头的2个字节。
(2)“range: bytes=-200”,它不是表示请求文件开始位置的201个字节,而是表示要请求文件结尾处的200个字节。
(3)如果last byte pos小于first byte pos,那么这个range请求就是无效请求,server需要忽略这个range请求,然后回应一个200,把整个文件发给client。
(4)如果last byte pos大于等于文件长度,那么这个range请求被认为是不能满足的,server需要回应一个416,requested range not satisfiable。
2.示例解释:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
三、content-range
用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
content-range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
四、header示例
请求下载整个文件:
get /test.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:文件总大小
一个最简单的断点续传实现大概如下:
1.客户端下载一个1024k的文件,已经下载了其中512k
2. 网络中断,客户端请求续传,因此需要在http头中申明本次需要续传的片段:
range:bytes=512000-
这个头通知服务端从文件的512k位置开始传输文件
3. 服务端收到断点续传请求,从文件的512k位置开始传输,并且在http头中增加:
content-range:bytes 512000-/1024000
并且此时服务端返回的http状态码应该是206,而不是200。
但是在实际场景中,会出现一种情况,即在终端发起续传请求时,url对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。在rfc2616中也有相应的定义,比如实现last-modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时rfc2616中还定义有一个etag的头,可以使用etag头来放置文件的唯一标识,比如文件的md5值。
终端在发起续传请求时应该在http头中申明if-match 或者if-modified-since 字段,帮助服务端判别文件变化。
另外rfc2616中同时定义有一个if-range头,终端如果在续传是使用if-range。if-range中的内容可以为最初收到的etag头或者是last-modfied中的最后修改时候。服务端在收到续传请求时,通过if-range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Java 二分法检索算法代码实现详解
下一篇: 为什么做网站营销做的不喜欢使用百度统计
推荐阅读
-
Java如何实现HTTP断点续传功能
-
如何基于python实现归一化处理
-
C#基于HttpWebRequest实现发送HTTP请求的方法分析
-
Python实现基于HTTP文件传输实例
-
SpringBoot 源码解析 (七)----- Spring Boot的核心能力 - SpringBoot如何实现SpringMvc的?
-
Linux如何实现断点续传文件功能
-
Springboot如何基于assembly服务化实现打包
-
基于HTML5 Ajax文件上传进度条如何实现(jquery版本)
-
如何基于SpringMVC实现断点续传(HTTP)
-
Centos 6.5环境实现本地局域网搭建YUM的方法【基于HTTP】