欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何基于SpringMVC实现断点续传(HTTP)

程序员文章站 2023-10-27 16:01:10
这篇文章主要介绍了如何基于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回应,回应的内容为新的文件的全部数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇: 情侣吵架

下一篇: 踢球