问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

CHttpFile怎么实现断点续传?

发布网友 发布时间:2022-04-20 01:53

我来回答

2个回答

懂视网 时间:2022-04-20 06:14

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会做出相应的处理。

热心网友 时间:2022-04-20 03:22

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为w www.sjtu.e.cn,文件名为down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, application/vnd.ms-powerpoint, */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Connection: Keep-Alive 服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下: 200 Content-Length=106786028 Accept-Ranges=bytes Date=Mon, 30 Apr 2001 12:56:11 GMT ETag=W/"02ca57e173c11:95b" Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给 Web服务器的时候要多加一条信息--从哪里开始。 下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。 GET /down.zip HTTP/1.0 User-Agent: NetFox RANGE: bytes=2000070- Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 仔细看一下就会发现多了一行RANGE: bytes=2000070- 这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。 服务器收到这个请求以后,返回的信息如下: 206 Content-Length=106786028 Content-Range=bytes 2000070-106786027/106786028 Date=Mon, 30 Apr 2001 12:55:20 GMT ETag=W/"02ca57e173c11:95b" Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT 和前面服务器返回的信息比较一下,就会发现增加了一行: Content-Range=bytes 2000070-106786027/106786028 返回的代码也改为206了,而不再是200了。 知道了以上原理,就可以进行断点续传的编程了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 萝卜丝的做法及成功要点,怎么蒸萝卜丝好吃 蒸萝卜的做法,蒸萝卜怎么做好吃,蒸萝卜的家常 文言书信格式 谁知道二手的尼桑轩逸撞车了,算重大事故再卖大概贬值多少钱啊 求写一篇文言文版的情书,写给女的,最少80字 普通二手车和事故二手车的差价差在哪里? 10年伊兰特修好的事故车能卖多少钱? 事故车,2018年二手五菱荣光1.5发动机,跑2万多公里能买多少钱? 求几篇好的文言文书信 手里预算比较少,二手的事故车值不值得入手? 出过事故的二手车是不是要比没出过事故相同的车要便宜很多? 事故车价格要缩水多少 下载软件的断电续传是什么原理? 在电脑里怎么给图片下方加文字? 什么是“蚝式恒动”? 谁家的有偏光3DLED大屏幕?哪位大神可以帮忙推荐一下? 液晶电视——等离子,LED,LCD,3D,3D等离子。这五种区别何在?回答简单点, 3d显示器和led显示器有什么区别 电脑显示器led和3d的区别? 3DLED显示屏为什么要选择深圳的厂家胜龙云? 无线蓝牙耳机怎么和电脑连接啊?电脑也带有蓝牙的 如何让一个网站支持断点续传 此女子在虎门镇虎门大桥的旅游小岛上卖门票,有谁见过? 联合体投标中标公示必须把两家单位都写出来吗 联合体投标各方须共同签章同时公示,各需承担什么责任 她在英语考试中取得好成绩用英文怎么说 联合体投标中标后 联合体投标,中标公示和中标通知书中是所有投标单位么 关于联合体中标的问题,懂的进来帮我看下。 联合体中标后牵头单位签合同 用英语翻译汤姆在这次考试中取得了好成绩 联合体投标什么意思 通过我的努力我在期末考试中取得优异成绩用英语怎么说 “在考试中取得好成绩,然而这里不开平时的努力学习”这句话用英文翻译下了 联合体中标后,在施工过程中,资料章刻哪家单位的? 有陈老师教我,我会在考试中取得好成绩,请用英文写下来,谢谢。 自动挡车驾驶技巧有哪些? 用注射器和橙子皮制作的空气压缩*是利用了空气的什么特性科学? 制作空气压缩枪的收获是什么 我们在科学课上制作的空气枪是利用压缩空气有什么的原理?