SpringBoot超⼤⽂件上传和断点续传的实现
⼀、概述
所谓断点续传,其实只是指下载,也就是要从⽂件已经下载的地⽅开始继续下载。在以前版本的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头中申明本次需要续传的⽚段:
springboot其实就是spring
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回应,回应的内容为新的⽂件的全部数据。
相关参考链接:
欢迎⼊⼀起讨论:374992201

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。