Electron中实现大文件上传和断点续传功能


Posted in Javascript onOctober 28, 2018

Electron官网的描述:Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。 Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的。

从官网的描述我们可以简单的概括,Electron是开源的框架,可以使用h5来开发跨平台pc桌面应用,这样前端开发这可以开发桌面应用了。由于它是基于Chromium和Node.js开发的,所以在Electron中既可以使用浏览器中的api也可以使用node的api。

下面我们在Electron中实现文件的上传以及断点续传。网上关于h5的上传下载的案例已经非常多,但是关于大文件的上传和续传的很少。

首先上传方案,我们通过将大文件进行分片处理,将大文件切割成固定大小的分片。通过node的fs.createReadStream方法实现:

singleUpload function(file){
  let path = file.path; //文件本地路径 
  let stats = fs.statSync(path);//读取文件信息
  let chunkSize = 3*1024*1024;//每片分块的大小3M
  let size = stats.size;//文件大小
  let pieces = Math.ceil(size / chunkSize);//总共的分片数 
  function uploadPiece (i){ 
    //计算每块的结束位置
    let enddata = Math.min(size, (i + 1) * chunkSize);
    let arr = [];
    //创建一个readStream对象,根据文件起始位置和结束位置读取固定的分片
    let readStream = fs.createReadStream(path, { start: i * chunkSize, end: enddata-1 });
      //on data读取数据
      readStream.on(‘data‘, (data)=>{
        arr.push(data)
      }) 
      //on end在该分片读取完成时触发
      readStream.on(‘end‘, ()=>{
        //这里服务端只接受blob对象,需要把原始的数据流转成blob对象,这块为了配合后端才转
        let blob = new Blob(arr)
        //新建formdata数据对象
        var formdata = new FormData();
        let md5Val = md5(Buffer.concat(arr));
        formdata.append("file", blob);
        console.log(‘blob.size‘,blob.size)
        formdata.append("md5", md5Val);
        formdata.append("size", size + ‘‘); // 数字30被转换成字符串"30"
        formdata.append("chunk", i + ‘‘);//第几个分片,从0开始
        formdata.append("chunks", pieces + ‘‘);//分片数
        formdata.append("name", name);//文件名
        post(formdata)//这里是伪代码,实现上传,开发者自己实现
  }
}

以上代码就是上传的核心部分,我们首先读取文件的基本信息,如路径,大小进行分块,然后将每块上传,我们上传循环上传整个文件的分片,就循环调用uploadpiece方法。那么我们怎么实现断点续传呢?上面的代码中我们计算每块的md5值,这里计算每个md5值就是为了断点续传使用。我们每次上传文件前,我们会先调用预上传接口,预上传接口中,前端传入fileId,后端会将改文件已经上传的分块的md5数组传给前端,前端将该文件的分块的md5值和后端返回的md5值进行逐个对比,跳过已经上传的分块。这样就实现了大文件的上传和断点续传的问题。

方案流程图:

Electron中实现大文件上传和断点续传功能

总结

以上所述是小编给大家介绍的Electron中实现大文件上传和断点续传功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
Bootstrap fileinput文件上传预览插件使用详解
May 16 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
JS实现的简单四则运算计算器功能示例
Sep 27 Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
Vue实现push数组并删除的例子
Nov 01 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
JS+canvas五子棋人机对战实现步骤详解
Jun 04 Javascript
前端开发基础javaScript的六大作用
Aug 06 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 #Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
Oct 28 #Javascript
深入浅析javascript函数中with
Oct 28 #Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 #Javascript
又拍云 Node.js 实现文件上传、删除功能
Oct 28 #Javascript
javascript中函数的写法实例代码详解
Oct 28 #Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 #Javascript
You might like
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
javascript基础知识讲解
2017/01/11 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
Python 开发Activex组件方法
2009/11/08 Python
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
全球最大的游戏市场:G2A
2018/07/05 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
C#笔试题和英文面试题
2013/02/07 面试题
课程设计心得体会
2013/12/28 职场文书
婚礼主持结束词
2014/03/13 职场文书
触电现场处置方案
2014/05/14 职场文书
社保委托书怎么写
2014/08/02 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
领导欢迎词范文
2015/01/26 职场文书
安全员岗位职责范本
2015/04/11 职场文书
个人催款函范文
2015/06/24 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
python脚本框架webpy模板赋值实现
2021/11/20 Python
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android