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 相关文章推荐
jquery text()要注意啦
Oct 30 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
JS获取URL中的参数数据
Dec 05 Javascript
jQuery中first()方法用法实例
Jan 06 Javascript
JS返回iframe中frameBorder属性值的方法
Apr 01 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
Jan 21 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
在Python中使用元类的教程
2015/04/28 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python初步实现word2vec操作
2020/06/09 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
保荐人的岗位职责
2013/11/19 职场文书
个人生活学习自我评价范文
2013/11/26 职场文书
普通员工辞职信
2014/01/17 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
军训拉歌口号
2014/06/13 职场文书
学校周年庆活动方案
2014/08/22 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
感谢信模板大全
2015/01/23 职场文书
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android