electron程序,因为本身原理上是基于浏览器内核的。所以,浏览器上很常见的文件下载功能,在electron中,也是比较常见的。那么,本文中,苏南大叔要聊的话题就是:在electron的渲染进程里面,如果碰到了文件下载的情况,electron是怎么处理的呢?

苏南大叔:electron程序,如何静默下载文件?文件下载形式总结 - electron-download-click
electron程序,如何静默下载文件?文件下载形式总结(图2-1)

本文测试环境,macelectron@5.0.7。本文讨论的基础是:基于传统意义上的chrome下载文件行为,在electron程序中,有着怎样的控制形态变化。当然,对于文件下载行为来说,您用node远程获得文件并保持,其实也是一种文件下载行为。不过,这个和本文的主旨相差较远。目前就暂时不予考虑了。

背景提示

本文中的渲染进程,就是普通的文件下载链接,下载的是小程序示例源码。代码如下:

<a href="http://searchbox.bj.bcebos.com/miniapp/demo-1.0.1.zip">下载小程序示例源码</a>

点击出对话框(默认)

默认情况下,在electron中点击一个下载链接,比如:.exe或者.zip的链接,就会跳出保存对话框。可以自由选择要存储的位置。点击确定之后就没有任何的消息了。是否下载完毕,需要自己去检查。

苏南大叔:electron程序,如何静默下载文件?文件下载形式总结 - electron-download-dialog
electron程序,如何静默下载文件?文件下载形式总结(图2-2)

点击直接下载

这种情况,是在主进程中,添加了一些控制代码,直接设置了下载路径,所以,并不会弹出下载位置的选择框了。这种情况下,就是用户点击,然后就再去约定好的目录下面去查看下载结果即可。这个方式需要渲染进程上出现可点击的下载链接,用户参与操作一下,但是用户参与之后没有任何提示。

//const path = require('path')
mainWindow.webContents.session.on('will-download', (event, item, webContents) => {
  const filePath = path.join(app.getPath('downloads'), item.getFilename());
  item.setSavePath(filePath);
  //...
})

监控will-download事件,然后使用item.setSavePath(),就可以省略掉下载设置对话框了。

代码静默下载(非用户参与)

在前两种情况中,还是需要用户参与的。至少都需要用户点击一下。那么,在这个环节中,将实现的是一句代码即可下载文件,完全静默,不需要用户做任何的参与,实际上也不需要渲染进程的参与。

//const path = require('path')
mainWindow.webContents.session.on('will-download', (event, item, webContents) => {
  const filePath = path.join(app.getPath('downloads'), item.getFilename());
  item.setSavePath(filePath);
  //...
})
mainWindow.webContents.downloadURL("http://searchbox.bj.bcebos.com/miniapp/demo-1.0.1.zip");

这里,使用下面的语句触发下载动作:

mainWindow.webContents.downloadURL(<url>)

使用下面的语句,触发保存动作:

item.setSavePath(filePath);

其它方案

因为electron是基于node的,所以,node下面的下载文件的方法,在electron中,也默认是可以使用的。但是,这个并不是本文中的讨论范围内,所以,这里暂作伏笔。

总结

在本文中,苏南大叔列举了在electron程序中,可能会遇到的文件下载的几种形式。这几种情况都存在着一个致命问题,那就是无法获得下载的进度,什么时候下载完毕了,也是不知道的。

那么,如何获得文件下载进度呢?请了解苏南大叔的electron系列博客文章,链接请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

 【加群】加入QQ群【175454274】和大家一起讨论这个问题

 【源码】本文代码片段及相关软件,请点此获取

 【绝密】秘籍文章入口,仅传授于有缘之人   electron

本站的忠实读者小伙伴,正在阅读下面这些文章: