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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
编写兼容IE和FireFox的脚本
May 18 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
Jan 12 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
jQuery快速高效制作网页交互特效
Feb 24 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
Mar 15 Javascript
vue-cli脚手架引入图片的几种方法总结
Mar 13 Javascript
layui 设置table 行的高度方法
Aug 17 Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
php目录操作实例代码
2014/02/21 PHP
php从字符串创建函数的方法
2015/03/16 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
php数组遍历类与用法示例
2019/05/24 PHP
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
离婚协议书该怎么写
2014/10/04 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python