首页 > 其他分享 >JS大文件分片上传/多线程上传

JS大文件分片上传/多线程上传

时间:2023-05-31 15:13:13浏览次数:46  
标签:文件 字节 bytes JS Range 源码 多线程 上传 下载

 一、概述

 

所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的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回应,回应的内容为新的文件的全部数据。

效果展示:

​编辑

​编辑

​编辑

​编辑

 

视频演示:

 

windows控件安装,,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

示例下载地址

源代码文档

asp.net源码下载jsp-springboot源码下载jsp-eclipse源码下载jsp-myeclipse源码下载php源码下载csharp-winform源码下载vue-cli源码下载c++源码下载

详细配置信息及思路

标签:文件,字节,bytes,JS,Range,源码,多线程,上传,下载
From: https://www.cnblogs.com/songsu/p/17446170.html

相关文章

  • redis是单线程还是多线程?为什么redis那么快?
    redis是单线程的。官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis为什么单线程还这么快?1、误区1:高性能的服务器一定是多线程的?2、误区2:多线程一定比单线程效率高?多线程需要cpu调......
  • JSP原理深度刨析
    1. 我的第一个JSP程序  351.1 原理  35 在WEB-INF目录之外创建一个index.jsp文件,然后这个文件中没有任何内容。- 将上面的项目部署之后,启动服务器,打开浏览器,访问以下地址:  - http://localhost:8080/jsp/index.jsp 展现在大家面前的是一个空白。  - 实际上访问以上的......
  • SpringBoot整合OSS文件上传
    一、注册阿里云账号并开通OSS服务1、登录阿里云账号2、创建一个bucket3、创建子用户对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改)4、配置上传跨域规则任何来源:*允许方法:POST任何请求头Headers:*二、文件上传方式1、服务器直传方式每个O......
  • vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)
    使用qrcodejs2生成二维码的方法:/***二维码生成*@paramcontent生成二维码内容*@paramdesc二维码底部描述*@paramqrcodeDom挂在dom*@returns{*|HTMLDivElement}*/exportfunctiongeneratorQrcode(content,desc,qrcodeDom=null){constqrcodeCo......
  • 多线程或监听器@Autowired注入null空指针
    //问题:在多线程中使用@Autowired注入IUserService时,userService使用时为null,获取不到bean//原因:newthread不在spring容器中,也就无法获得spring中的bean对象;@AutowiredprivateIUserServiceuserService;//解决:手动获取bean对象privateIUserServiceuserService=AppCo......
  • Java大文件分片上传/多线程上传功能
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName
    @JSONField主要用于返回出参转换这个注解分别可以注解在实体类的属性、setter和getter方法上publicclassTest{/*注解在属性上的时候可以设置一些序列化、格式化的属性@JSONField(serialize=false)---->序列化的时候忽略这个属性@JSO......
  • AngularJS directive入门例子
    这是《AngularJS》这本书里面提供的一个例子: JS代码:varexpanderModule=angular.module('expanderModule',[])expanderModule.directive('expander',function(){return{restrict:'EA',replace:true,transclude:true......
  • wireshark分析tcp传输之文件上传速率问题
    在网络性能问题排查思路那一节里,我提到了查看系统网络瓶颈的方法以及排查丢包问题的手段。但就此分析网络问题还不够精细,有时网络资源并没有达到瓶颈,或者并没有丢包产生,但是网络传输速率就是很慢,或者有丢包产生,但无法知道丢包的详细过程,无法知道整个tcp传输过程的具体情况。如何......
  • JS模块式开发
    问题:js文件须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难! C语言中模块开发-include requireJS库——借鉴类似C中模块依赖解决方式(include)<scriptsrc="js/require.js"data-main="js/......