electron程序,如何监控文件下载进度,并显示进度条?
发布于 作者:苏南大叔 来源:程序如此灵动~

在上一篇文章中,苏南大叔描述了在electron
下载文件的时候,触发下载的几种形式。其中在文末留下了一个伏笔,那就是无法获知文件下载的进度,以及是否以及完成了下载。那么在本文中,苏南大叔就要进一步描述electron
程序的文件下载过程中,如何监控文件下载进度。

本文测试环境:mac
、electron@5.0.7
。
基本描述
本文中,在electron
的渲染进程里面,苏南大叔放了几个文件下载的链接,是百度开发者工具的下载链接,用于测试。而且,在理解本文的内容之前,苏南大叔提示您,先读一下下面这篇前置文章:
will-download
事件
在electron
的文件下载过程中,所有的控制层面代码,都是在一个will-download
事件中进行编写的。所以,这个will-download
事件,是解题的前提条件。
这里重点需要专注的就是item
对象,关键信息都在这个item
之中存储。这个item
就可以理解为被下载的这个文件。值得注意的是:
- 下载链接点击触发后,就会触发
will-download
。 - 然后会根据是否存在
item.setSavePath()
语句,来决定是否跳出保存对话框。
特别需要注意的是:保存对话框不阻塞进程!不阻塞进程!你选择目录的时候,没准都已经下载完了。这个操作很邪门。
是否出现保存对话框
如果有设置item.setSavePath()
,就不会出现保存对话框,如果没有设置,就会出现对话框。这个理解上有些奇怪,不过确实就是这么触发的。
上面的代码,就是把文件默认保存到了downloads
这个系统目录下面了。具体的更多细节,可以参见下面的这篇文字:
注册item
事件
对每个will-download
里面的item
,通过事件注册,进而就可以获得更多实时信息。比如:下载的进度百分比。那么item
可以注册的事件都有那些呢?

item.on('updated',()=>{})
这个item
的updated
事件,是时刻更新触发的,获得进度就是主要在这里获取的。
从上述代码中,苏南大叔讲述了两个item
事件:
- 下载进行中,
progressing
,其中还有个暂停状态item.isPaused()
- 下载被打断,
interrupted

计算进度
在item
的updated
事件中,苏南大叔选择一个合适的地方来获得合适的信息。对于本文的需求来说,主要推荐获取的item
信息如下:
item.getFilename()
下载文件的名称item.getSavePath()
下载文件的路径item.getReceivedBytes()
下载文件已经下载的字节数item.getTotalBytes()
下载文件的总字节数
已经下载的进度百分比:
item.once('done', () => {})
下载完成事件done
中的state
有三个分支,分别是:
completed
,喜大普奔,下载完成。cancelled
,用户主动取消下载。- 其它,未知错误。
显示进度状态
主进程
进度状态的表现形式上,就多种多样了,因为上述代码都是在主进程中的,所以,主进程是近水楼台先得月的,可以在console
中任意输出。

异常处理
- 如果想要通知渲染进程中,这个就可能存在一个
mainWindow
不存在的异常。请注意处理。
ipc
通知渲染进程
主进程通知渲染进程的时候,也是需要这个mainWindow
对象的。所以,一定要控制异常。

显示进度条
还可以在任务栏图标上面显示下载进度,这个效果是很高大上的。不过一样需要判断异常mainWindow
。显示进度:
隐藏进度:

完整代码
主进程:
渲染进程:
相关链接
总结
本文中,苏南大叔主要讲述的话题是:electron
程序,如何监控文件下载进度?至于最终的进度表现形式,大家还是根据自己的实际需求,进行处理比较好。
更多苏南大叔的electron
程序,请点击苏南大叔的博客:



666
66
666
666
6+6666
感谢分享,找了好久终于找到了
66666
特好得完善哦,其他的只有部分,真不错
非常感谢你的分享。
666
可以保留起来慢慢看。
很好的内容
解我燃眉之急,666
真的牛,解决了我的问题
大佬厉害呀
666
感谢
NB
6666
666