zoukankan      html  css  js  c++  java
  • CEfSharp下载文件 弹出保存框,实现 IDownloadHandler 接口

    上节讲了如何将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 类:

    该类提供了两个接口,分别是 OnBeforeDownloadOnDownloadUpdated,前者是在下载任务开始之前就会被回调的一个接口,你需要根据你的需求在该接口中实现一些预处理操作。后者是任务下载过程中的回调接口,包含了任务的进度、状态以及控制功能。下面分别详细介绍两个接口。

    OnBeforeDownload 接口

    virtual void OnBeforeDownload(
          CefRefPtr<CefBrowser> browser,
          CefRefPtr<CefDownloadItem> download_item,
          const CefString& suggested_name,
          CefRefPtr<CefBeforeDownloadCallback> callback) = 0;
    

    上面介绍到该接口会在文件开始下载前被调用,

    • browser 参数表示当前实例
    • download_item 中包含了该下载任务的状态信息,可以通过其成员函数 IsInProgressIsCompleteIsCanceled 等方法判断文件的当前状态,但在下载文件之前去判断这些貌似没有什么意义。
    • 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

    =====================================================================================================

  • 相关阅读:
    JVM内存管理概述与android内存泄露分析
    android中activity.this跟getApplicationContext的区别
    Android广播机制概述
    android中shape属性大全
    android studio视频教学
    四十六、android中的Bitmap
    访问限制:由于对必需的库 C:/Program Files/Java/jre6/lib/rt.jar 具有一定限制,因此无法访问类型。。
    优质博客内容链接
    java日期格式大全 format SimpleDateFormat
    java中equals与==的区别
  • 原文地址:https://www.cnblogs.com/mq0036/p/11932228.html
Copyright © 2011-2022 走看看