CEF 下载功能非常容易拓展,它提供了丰富的接口和控制功能,比如对正在下载的文件实现暂停、继续、取消等操作。并且 CEF 还帮我们默认实现了一个另存为的对话框,如果不是必须你甚至都不需要去自己实现这个保存对话框。接下来我们来看 CEF 对于下载功能提供的两个接口(使用 cefclient 项目举例)
在一切开始之前,首先你的 ClientHandler 要继承 CefDownloadHandler 类:
该类提供了两个接口,分别是 OnBeforeDownload
和 OnDownloadUpdated
,前者是在下载任务开始之前就会被回调的一个接口,你需要根据你的需求在该接口中实现一些预处理操作。后者是任务下载过程中的回调接口,包含了任务的进度、状态以及控制功能。下面分别详细介绍两个接口。
virtual void OnBeforeDownload(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
const CefString& suggested_name,
CefRefPtr<CefBeforeDownloadCallback> callback) = 0;
上面介绍到该接口会在文件开始下载前被调用,
IsInProgress
,IsComplete
,IsCanceled
等方法判断文件的当前状态,但在下载文件之前去判断这些貌似没有什么意义。download_path
就是保存文件的名称,第二个参数表示是否弹出保存对话框,当把第二个参数设置为 true 时,CEF 会帮我们弹出一个 Save File 的保存对话框。如果你设置为 false 了,那么将不弹出保存对话框,并自动保存文件到第一个参数设定的路径下。通过该接口我们可以对任务做一些预处理,比如当你想在界面中创建一个下载任务时,可以通过 download_item
参数获得任务 ID(GetId 方法)交给 UI 去表示任务即将开始。接下来进入下面的下载任务状态更新函数时,再根据任务 Id 去更新界面内容。
该接口在任务下载过程中被回调,但据我测试,这个接口会优先于 OnBeforeDownload 接口被调用,具体原因还是不太了解,不过无伤大雅,我们只关注这里的任务进度、状态和控制功能就可以了。
virtual void OnDownloadUpdated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
CefRefPtr<CefDownloadItemCallback> callback) {}
CEF 提供的下载接口控制功能还是很丰富的,甚至将进度中下载的速度都帮你计算完成你可以直接使用的。如果想配合 UI 实现一些个性化的展示都是可以完成的。大家可以自己试一试,遇到任何技术问题欢迎在下方讨论。