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 相关文章推荐
用ASP将SQL搜索出来的内容导出为TXT的代码
Jul 27 Javascript
JS对URL字符串进行编码/解码分析
Oct 25 Javascript
异步动态加载js与css文件的js代码
Sep 15 Javascript
简介AngularJS的HTML DOM支持情况
Jun 17 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
Aug 02 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
浅谈react性能优化的方法
Sep 05 Javascript
JS实现的A*寻路算法详解
Dec 14 Javascript
Vue vm.$attrs使用场景详解
Mar 08 Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 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读写文件的方法(生成HTML)
2006/11/27 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
js的三种继承方式详解
2017/01/21 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
python处理json数据中的中文
2014/03/06 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
服务生自我鉴定
2014/01/22 职场文书
建设投标担保书
2014/05/13 职场文书
寒山寺导游词
2015/02/03 职场文书
社区文明倡议书
2015/04/28 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
转学证明范本
2015/06/19 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS