最近把公司一个 Web APP 项目用 Electron 封装了一个 Mac 客户端,主要是弥补了 Web 浏览器的一些先天不足:
- 支持原生的通知
- 支持原生的 icon 未读提醒
- 支持原生的系统托盘
- 增强网络状态变更的感知
其中以前下载方式是通过打开系统浏览器进行文件下载的。因为文件需要鉴权,还得携带一些敏感的 cookie、token 过去,感觉不安全,所以希望文件下载能在 APP 内完成
通过 Electron 中 will-download 事件,我们可以很方便的解决这个问题
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | mainWindow.webContents.session.on('will-download', (e, item) => {//获取文件的总大小
 const totalBytes = item.getTotalBytes();
 
 //设置文件的保存路径,此时默认弹出的 save dialog 将被覆盖
 const filePath = path.join(app.getPath('downloads'), item.getFilename());
 item.setSavePath(filePath);
 
 //监听下载过程,计算并设置进度条进度
 item.on('updated', () => {
 mainWindow.setProgressBar(item.getReceivedBytes() / totalBytes);
 });
 
 //监听下载结束事件
 item.on('done', (e, state) => {
 //如果窗口还在的话,去掉进度条
 if (!mainWindow.isDestroyed()) {
 mainWindow.setProgressBar(-1);
 }
 
 //下载被取消或中断了
 if (state === 'interrupted') {
 electron.dialog.showErrorBox('下载失败', `文件 ${item.getFilename()} 因为某些原因被中断下载`);
 }
 
 //下载完成,让 dock 上的下载目录Q弹一下下
 if (state === 'completed') {
 app.dock.downloadFinished(filePath);
 }
 });
 });
 
 |