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 相关文章推荐
从阿里妈妈发现的几个不错的表单验证函数
Sep 21 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
关于IE BUG与字符串截取substr的解决办法
Apr 10 Javascript
jquery选择器需要注意的问题
Nov 26 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
Sep 13 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
微信小程序 如何获取网络状态
Jul 26 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 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
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
php+mysql实现无限级分类
2015/11/11 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
建房协议书
2014/04/11 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
酒会开场白大全
2015/06/01 职场文书
教师继续教育反思周记
2015/06/25 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL