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实现ASP分页函数 HTML分页函数
Sep 22 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
基于javascript实现页面加载loading效果
Sep 15 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
Sep 18 Javascript
js自定义input文件上传样式
Oct 26 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
Nuxt.js实战和配置详解
Aug 05 Javascript
十分钟教你上手ES2020新特性
Feb 12 Javascript
微信小程序自定义底部弹出框功能
Nov 18 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
python数据结构树和二叉树简介
2014/04/29 Python
Python实现把数字转换成中文
2015/06/29 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
人事任命书怎么写
2014/06/05 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
学期个人工作总结
2015/02/13 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript