上节讲了如何将CefSharp集成到C#中,但集成后将web界面链接进ChromiumWebBrowser后,但web界面上下载附件的功能不好使咯。
百度了半天还是没搞定,只能去看官网的Excample和源代码,最后瞎猫碰死耗子给搞定了,需要去实现一个接口。
public RevenueContractFrmWeb(Adapter adapter) { Adapter = adapter; InitializeComponent(); //string url = GlobalDefination.Urlex + "/go-logistics-client/inAndOutPages/incomeContract/contractMg/ContractMain.jsp"; //webBrowser.Navigate(url+"?sessionId=" + adapter.SessionId); string url = GlobalDefination.Urlex + "/go-logistics-client/inAndOutPages/incomeContract/contractMg/ContractMain.jsp?sessionId=" + adapter.SessionId; CefSharp.WinForms.ChromiumWebBrowser wb = new CefSharp.WinForms.ChromiumWebBrowser(url); wb.Dock = DockStyle.Fill; this.Controls.Add(wb); wb.DownloadHandler = new MyDownloadHandler(); }
实现类
internal class MyDownloadHandler : IDownloadHandler { public bool OnBeforeDownload(CefSharp.DownloadItem downloadItem, out string downloadPath, out bool showDialog) { downloadPath =""; showDialog = true; return true; } public bool OnDownloadUpdated(CefSharp.DownloadItem downloadItem) { return false; } }
出处:https://blog.csdn.net/weiyongliang_813/article/details/50575706
=====================================================================================================
CEfSharp下载文件 弹出保存框 IDownloadHandler,Winfrom嵌入网页导出功能响应
using CefSharp; public ChromiumWebBrowser browser; NativeAppJsObjBasic NativeAppJsObj; //窗体部分 private void FrmWebView_Load(object sender, EventArgs e) { browser = new ChromiumWebBrowser(URL); panel1.Controls.Add(browser); browser.Dock = DockStyle.Fill; NativeAppJsObj = new NativeAppJsObjBasic(); browser.RegisterJsObject("NativeAppJsObj", NativeAppJsObj, true); NativeAppJsObj.OnSessionExpired += NativeAppJsObj_OnSessionExpired; browser.IsBrowserInitializedChanged += Browser_IsBrowserInitializedChanged; browser.DownloadHandler = new MyDownLoadFile(); } /// <summary> /// 响应下载文件兼容 /// </summary> public class MyDownLoadFile : IDownloadHandler { public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback) { if (!callback.IsDisposed) { using (callback) { callback.Continue(@"C:\Users\" + System.Security.Principal.WindowsIdentity.GetCurrent().Name + @"\Downloads\" + downloadItem.SuggestedFileName, showDialog: true); } } } public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback) { //downloadItem.IsCancelled = false; } public bool OnDownloadUpdated(CefSharp.DownloadItem downloadItem) { return false; } }
出处:https://blog.csdn.net/qq_41715982/article/details/97284255
=====================================================================================================
如果希望下载的是使用IE下载,可参考下面的方法:
public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
{
WebBrowser ie = new WebBrowser();
ie.Navigate(downloadItem.Url);
}
原文链接:https://blog.csdn.net/CFY530/article/details/81145875
=====================================================================================================
最近一直在做CEFsharp 方面的,遇到了下载文件的无法保存的问题 。 记录解决下。 主要是应用了
IDownloadHandler
调用方法:
web.MenuHandler = new MyWebContextMenu();
web.DownloadHandler = new MyDownLoadFile();
IDownloadHandler.cs文件
/// <summary> /// 下载文件 /// </summary> public class MyDownLoadFile : IDownloadHandler { public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback) { if (!callback.IsDisposed) { using (callback) { callback.Continue(@"C:\Users\" + System.Security.Principal.WindowsIdentity.GetCurrent().Name+ @"\Downloads\" + downloadItem.SuggestedFileName, showDialog: true); } } } public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback) { //downloadItem.IsCancelled = false; } public bool OnDownloadUpdated(CefSharp.DownloadItem downloadItem) { return false; } }
出处:https://blog.csdn.net/u010919083/article/details/78342503
=====================================================================================================
CEF 下载功能非常容易拓展,它提供了丰富的接口和控制功能,比如对正在下载的文件实现暂停、继续、取消等操作。并且 CEF 还帮我们默认实现了一个另存为的对话框,如果不是必须你甚至都不需要去自己实现这个保存对话框。接下来我们来看 CEF 对于下载功能提供的两个接口(使用 cefclient 项目举例)
继承 CefDownloadHandler
在一切开始之前,首先你的 ClientHandler 要继承 CefDownloadHandler 类:
该类提供了两个接口,分别是 OnBeforeDownload
和 OnDownloadUpdated
,前者是在下载任务开始之前就会被回调的一个接口,你需要根据你的需求在该接口中实现一些预处理操作。后者是任务下载过程中的回调接口,包含了任务的进度、状态以及控制功能。下面分别详细介绍两个接口。
OnBeforeDownload 接口
virtual void OnBeforeDownload( CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item, const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback) = 0;
上面介绍到该接口会在文件开始下载前被调用,
- browser 参数表示当前实例
- download_item 中包含了该下载任务的状态信息,可以通过其成员函数
IsInProgress
,IsComplete
,IsCanceled
等方法判断文件的当前状态,但在下载文件之前去判断这些貌似没有什么意义。 - suggested_name 代表当前 CEF 帮你设定好的建议保存名称,一般会截取文件路径中最后的文件名作为建议名称。
- callback 这个参数比较重要,当你调用了 callback 的 Continue 方法后,任务就开始下载了,该回调第一个参数
download_path
就是保存文件的名称,第二个参数表示是否弹出保存对话框,当把第二个参数设置为 true 时,CEF 会帮我们弹出一个 Save File 的保存对话框。如果你设置为 false 了,那么将不弹出保存对话框,并自动保存文件到第一个参数设定的路径下。
通过该接口我们可以对任务做一些预处理,比如当你想在界面中创建一个下载任务时,可以通过 download_item
参数获得任务 ID(GetId 方法)交给 UI 去表示任务即将开始。接下来进入下面的下载任务状态更新函数时,再根据任务 Id 去更新界面内容。
OnDownloadUpdated 接口
该接口在任务下载过程中被回调,但据我测试,这个接口会优先于 OnBeforeDownload 接口被调用,具体原因还是不太了解,不过无伤大雅,我们只关注这里的任务进度、状态和控制功能就可以了。
virtual void OnDownloadUpdated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item, CefRefPtr<CefDownloadItemCallback> callback) {}
- browser 这个不多介绍了
- download_item 与上面介绍的一样,可以获取任务的进度、状态、下载速度、已经下载量等,可以看一下 CefDownloadItem 的接口看一下都有什么控制功能。
- callback 这里的 callback 和上面接口的 callback 是不一样的,这个 callback 可以控制任务的暂停、继续、停止等操作,你可以维护一份当前任务的列表将该 callback 与任务 Id 绑定,当界面传来暂停任务的控制消息时,可以通过任务 Id 到列表中找到这个 callback,调用 callback 的 Pause 方法来暂停任务。当然别忘记在任务完成或者被取消的时候从列表中移除这些 callback 和任务 Id 的绑定关系。
总结
CEF 提供的下载接口控制功能还是很丰富的,甚至将进度中下载的速度都帮你计算完成你可以直接使用的。如果想配合 UI 实现一些个性化的展示都是可以完成的。大家可以自己试一试,遇到任何技术问题欢迎在下方讨论。
出处:https://www.mycode.net.cn/language/cpp/2627.html
=====================================================================================================