首页 > 其他分享 >HTML5实现文件断点续传的方法

HTML5实现文件断点续传的方法

时间:2023-10-14 10:11:49浏览次数:33  
标签:断点续传 slice 文件 xhr HTML5 服务器 上传

HTML5的FILE api,有一个slice方法,可以将BLOB对象进行分割。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段将文件进行拼接。

断点续传原理

目前比较常用的断点续传的方法有两种,一种是通过websocket接口进行文件上传,另一种是通过ajax,两种方法各有千秋,虽然websocket听起来比较高端些,但是除了用了不同的协议外其他的算法基本上都是很相似的,并且服务端要开启ws接口,这里用相对方便的ajax来说明断点上传的思路。

说来说去,断点续传最核心的内容就是把文件“切片”然后再一片一片的传给服务器,但是这看似简单的上传过程却有着无数的坑。

首先是文件的识别,一个文件被分成了若干份之后如何告诉服务器你切了多少块,以及最终服务器应该如何把你上传上去的文件进行合并,这都是要考虑的。

因此在文件开始上传之前,我们和服务器要有一个“握手”的过程,告诉服务器文件信息,然后和服务器约定切片的大小,当和服务器达成共识之后就可以开始后续的文件传输了。

前台要把每一块的文件传给后台,成功之后前端和后端都要标识一下,以便后续的断点。

当文件传输中断之后用户再次选择文件就可以通过标识来判断文件是否已经上传了一部分,如果是的话,那么我们可以接着上次的进度继续传文件,以达到续传的功能。

文件的前端切片

有了HTML5 的 File api之后切割文件比想象的要简单的多。

只要用slice 方法就可以了

var packet = file.slice(start, end);

参数start是开始切片的位置,end是切片结束的位置 单位都是字节。通过控制start和end 就可以是实现文件的分块

如:

file.slice(0,1000);
file.slice(1000,2000);
file.slice(2000,3000);
// ......

文件片段的上传

上一部我们通过slice方法把文件分成了若干块,接下来要做的事情就是把这些碎片传到服务器上。

这里我们用ajax的post请求来实现

var xhr = new XMLHttpRequest();
var url = xxx // 文件上传的地址 可以包括文件的参数 如文件名称 分块数等以便后台处理
xhr.open('POST', url, true);
xhr.onload = function (e){
// 判断文件是否上传成功,如果成功继续上传下一块,如果失败重试该快
}
xhr.upload.onprogress = function(e){
// 选用 如果文件分块大小较大 可以通过该方法判断单片文件具体的上传进度
// e.loaded 该片文件上传了多少
// e.totalSize 该片文件的总共大小
}
xhr.send(packet);

文件上传到后台后,后台程序如PHP会做出相应的处理。

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/14/html5%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e7%9a%84%e6%96%b9%e6%b3%95/

欢迎入群一起讨论

 

 

标签:断点续传,slice,文件,xhr,HTML5,服务器,上传
From: https://www.cnblogs.com/songsu/p/17763732.html

相关文章

  • 基于Win 自带的.NET FrameWork平台,使用文本文件编写C#代码,命令行编译以及引用第三方库
    转载自https://www.infoq.cn/article/2015/12/visual-studio-windows 不用VisualStudio也能开发.NETWindows应用邵思华2015-12-29本文字数:2915字阅读完需:约10分钟对于.NET应用的开发人员而言,以VisualStudio(简称VS)作为首选的开发工具应当是一种最......
  • python实现fasta文件碱基序列每行按照指定数目输出
     001、(base)[root@pc1test1]#lsa.fatest.py(base)[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggjjjcccjjjjjj>chr3ccc>chr4aaaaatt(base)[root@pc1test1]#cattest.py##程序#!/usr/bin/envpython3#......
  • 将excel文件导入到Navicat的mysql中步骤详解
    将转换好的csv文件导入到Navicat中1、右键数据库中表的名称,选中导入向导:2、之后选择导入的文件结构:我们在这里选中excel类型;点击下一步;3、浏览到excel文件的路径然后选中该表:点击下一步;4、自定义一些附加选项点击下一步;5、选中这个新建表然后点击下一步;6、修改表......
  • python 实现统计fasta文件每一条序列的长度
     001、a、[root@pc1test1]#lsa.fatest.py[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggccc>chr3cccttt>chr4aaaaattt[root@pc1test1]#cattest.py##统计每条序列的长度#!/usr/bin/envpython3#-*-coding:......
  • 使用python将txt文件中的ip地址转换成当地城市名称
    具体代码importreimportrequestsimportconcurrent.futures#用于匹配IPv4地址的正则表达式ipv4_pattern=re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b')#用于发送API请求并获取城市信息的函数defget_city_info(ip):response=requests.get(f'http://ip-......
  • python 中序列ID从fasta文件中批量提取序列数据
     001、[root@pc1test1]#lsa.fachr.listtest.py[root@pc1test1]#cata.fa##测试fasta文件>chr1tttcccggg>chr2tttgggccc>chr3cccttt>chr4aaaaattt[root@pc1test1]#catchr.list##序列IDchr2chr4 [root@pc1......
  • 文件默认打开方式 + mysql导入错误 + 输入法问题
    文件默认打开方式默认应用修改:设置—》应用—》默认应用—》按文件类型指定默认应用mysql导入错误Unknowncollation:'utf8mb4_0900_ai_ci'Mysql导入sql文件时,出Unknowncollation:'utf8mb4_0900_ai_ci'错误。原因:sql文件是从高版本mysql(8.0)中导出的,导入到......
  • 使用python对txt文件的日期格式进行清洗
    我使用的Java对文件日期进行清洗,看到友友用的python清洗,就问了问应该如何做,代码是能看懂,但是若是要求我自己一步一步写的话,应该不太行~具体代码importrefromdatetimeimportdatetime#读取文件withopen('result3.txt','r')asfile:data=file.read()#使用正......
  • Linux开发环境中使用shell/python脚本快速自动打包并查看apk文件
    最近工作中突然遇到一个很烦人的问题,事情的起因是这样的.我参与开发/维护着大概5个项目,负责服务端后台的同事经常在自己的本地电脑启着本地服务测试一些东西,而他们的本地局域网IP是经常变动的,那么问题来了,只要他们的IP地址变动了就会过来找我针对某个局域网IP地址为某个......
  • H5怎么实现文件断点续传
    这次给大家带来H5怎么实现文件断点续传,H5怎么文件断点续传的注意事项有哪些,下面就是实战案例,一起来看一下。HTML5的FILEapi,有一个slice方法,可以将BLOB对象进行分割。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段......