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 相关文章推荐
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
探讨javascript是不是面向对象的语言
Nov 21 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 Javascript
实例详解jQuery表单验证插件validate
Jan 18 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
正则 js分转元带千分符号详解
Mar 08 Javascript
AngularJS表单验证功能分析
May 26 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 Javascript
从零开始实现Vue简单的Toast插件
Dec 03 Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 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/07/17 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
JavaScript中String.prototype用法实例
2015/05/20 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
Python常用内置模块之xml模块(详解)
2017/05/23 Python
Python饼状图的绘制实例
2019/01/15 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
如何写出高性能的JSP和Servlet
2013/01/22 面试题
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
简历上的自我评价
2014/02/03 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
中班中秋节活动反思
2014/02/18 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
复试通知单模板
2015/04/24 职场文书
教师聘用意向书
2015/05/11 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
python批量创建变量并赋值操作
2021/06/03 Python