更多课程 选择中心

Java培训
达内IT学院

400-111-8989

Java基础教程:Java实现断点上传视频文件

  • 发布:Java培训
  • 来源:Java教程
  • 时间:2020-11-27 11:20

所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的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培训课程学习什么?
Java自学入门到精通学习路线

Java自学入门到精通学习路线

零基础学习Java开发的学习步骤

零基础学习Java开发的学习步骤

Java程序员需要掌握的基础算法

Java程序员需要掌握的基础算法

Java后端开发需要掌握哪些技能?

Java后端开发需要掌握哪些技能?

  • 关注微信公众号

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 视频学习QQ群

    添加QQ群:1143617948

    免费领取达内课程视频学习资料

Copyright © 2018 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
贵州省

福建省

  • 达内厦门软件园中心
广西省

海南省