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 相关文章推荐
js确认删除对话框效果的示例代码
Feb 20 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
Oct 09 Javascript
javascript跨域总结之window.name实现的跨域数据传输
Nov 01 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
Jul 01 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
Bootstrap实现翻页效果
Nov 27 Javascript
vue实现页面滚动到底部刷新
Aug 16 Javascript
如何开发一个渐进式Web应用程序PWA
May 10 Javascript
vue组件vue-esign实现电子签名
Apr 21 Vue.js
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将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
Yii全局函数用法示例
2017/01/22 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
使用python装饰器验证配置文件示例
2014/02/24 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
Python PIL库图片灰化处理
2020/04/07 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
企业演讲稿范文
2013/12/28 职场文书
高中毕业自我评价
2014/02/08 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
庆元旦演讲稿
2014/09/15 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python