【问题标题】:Download file with CefSharp WinForms使用 CefSharp WinForms 下载文件
【发布时间】:2015-12-15 12:33:18
【问题描述】:

我正在尝试使用 CefSharp WinForms 从我的应用程序中下载一些文件(图像、音频文件或其他文件)。我阅读了许多其他帖子,但似乎没有任何效果。 你有实现 CefSharp 下载器的示例代码吗?

我尝试下载一些文件,但没有任何反应。

【问题讨论】:

  • 你到底想做什么?显示保存对话框?
  • 分享您尝试过的代码。你能比“什么都没有发生”更具体吗?
  • 我在其他帖子上读到了一些关于此的内容,我尝试了所有这些,但没有。我尝试在具体实现这样的代码:groups.google.com/forum/?nomobile=true#!topic/cefsharp/…我想知道在这种情况下使用的方法,因为我没有找到任何相关信息。
  • 我的答案是为那些有我同样问题的人准备的,但当然,这个解决方案可以被任何其他没有 DownloadHandler 类的项目使用。此类对于下载管理器的正确工作至关重要。

标签: c# winforms download chromium-embedded cefsharp


【解决方案1】:

2天后,我终于做到了。 对于有同样问题的人,这里是简单的解决方案。 如果您使用的是 MinimalExample,则必须下载 Cefsharp 示例 (cefsharp-master) 并解压缩并执行以下操作:

  1. 右键单击您的项目 -> 添加现有项目
  2. 在 cefsharp-master 中导航 -> CefSharp.example -> 选择 DownloadHandler.cs
  3. 进入 BrowserForm.cs 类并输入:

    browser.DownloadHandler = new DownloadHandler();

  4. 完成!



下载处理程序.cs

// Copyright © 2013 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

using System;

namespace CefSharp.Example.Handlers
{
    public class DownloadHandler : IDownloadHandler
    {
        public event EventHandler<DownloadItem> OnBeforeDownloadFired;

        public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

        public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
        {
            OnBeforeDownloadFired?.Invoke(this, downloadItem);

            if (!callback.IsDisposed)
            {
                using (callback)
                {
                    callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
                }
            }
        }

        public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
        {
            OnDownloadUpdatedFired?.Invoke(this, downloadItem);
        }
    }
}

【讨论】:

  • 应该把 browser.DownloadHandler = new DownloadHandler(); ?内部初始化方法还是浏览器打开方法?
  • 为什么callback 被处理在OnBeforeDownload 而不是OnDownloadUpdated。它不应该同时处理吗?
  • 非常感谢!!!!我需要 3 天!
【解决方案2】:

要解决这个问题,只需下载类 DownloadHandler.cs 找到here

之后,将其导入到你的 Visual Studio 项目中,并将这一行添加到主窗体的代码中:

MyBrowser.DownloadHandler = new DownloadHandler();

并将其添加到代码的顶部:

using CefSharp.Example;

然后尝试从您的浏览器下载一些东西,它应该可以工作!

【讨论】:

  • 链接到源代码返回错误 404。最好将源代码包含在内。
  • 像魅力一样工作!
【解决方案3】:

我之所以包含以下内容,是因为 OnBeforeDownloadFired() 的实现未在许多有关如何使用 DownloadHandler 类的在线示例中显示,并且在引用的 DownloadHandler.cs 中缺少它。

如果下载链接的目标是“_blank”,这有助于解决下载文件(例如 .mobi 电子书)的棘手问题。如果没有目标,则会触发下载对话框。使用 _blank 目标,我不得不取消弹出窗口并在浏览器中打开一个新的自定义选项卡,但是当这种情况发生时,没有触发下载对话框。

我认为这是对的。希望它对您有所帮助,或者至少给您一个开始:

DownloadHandler downer = new DownloadHandler(this);
browser.DownloadHandler = downer;
downer.OnBeforeDownloadFired += OnBeforeDownloadFired;
downer.OnDownloadUpdatedFired += OnDownloadUpdatedFired;

private void OnBeforeDownloadFired(object sender, DownloadItem e)
{
    this.UpdateDownloadAction("OnBeforeDownload", e);
}

private void OnDownloadUpdatedFired(object sender, DownloadItem e)
{
    this.UpdateDownloadAction("OnDownloadUpdated", e);
}

private void UpdateDownloadAction(string downloadAction, DownloadItem downloadItem)
{
    /*
    this.Dispatcher.Invoke(() =>
    {
        var viewModel = (BrowserTabViewModel)this.DataContext;
        viewModel.LastDownloadAction = downloadAction;
        viewModel.DownloadItem = downloadItem;
    });
    */
}

// ...

public class DownloadHandler : IDownloadHandler
{
    public event EventHandler<DownloadItem> OnBeforeDownloadFired;

    public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

    MainForm mainForm;

    public DownloadHandler(MainForm form)
    {
        mainForm = form;
    }

    public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
    {
        var handler = OnBeforeDownloadFired;
        if (handler != null)
        {
            handler(this, downloadItem);
        }

        if (!callback.IsDisposed)
        {
            using (callback)
            {
                callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
            }
        }
    }

    public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
    {
        var handler = OnDownloadUpdatedFired;
        if (handler != null)
        {
            handler(this, downloadItem);
        }
    }
}

// ...

【讨论】:

  • 这个很好用,所有的文件下载状态都在那里,剩下的很容易实现,感谢这个提示!
  • 我不知道编写“CefSharp.Example”时的“Continue”参数如何。此时,您可以放心地将“showDialog: true”替换为“true”。
【解决方案4】:

在你的主窗体中添加这个

 CefBrowser = new ChromiumWebBrowser("http://google.com", null);
            CefBrowser.Margin = Padding.Empty;
            // browsers.Size = new Size(900, 600);// note here

            DownloadHandler downloadHandler = new DownloadHandler();
            CefBrowser.DownloadHandler = downloadHandler;

只需创建类 DownloadHandler

  public class DownloadHandler : IDownloadHandler
{
    public event EventHandler<DownloadItem> OnBeforeDownloadFired;

    public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

    public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem,
        IBeforeDownloadCallback callback)
    {
        OnBeforeDownloadFired?.Invoke(this, downloadItem);

        if (!callback.IsDisposed)
        {
            using (callback)
            {
                callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
            }
        }
    }

    public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem,
        IDownloadItemCallback callback)
    {
        OnDownloadUpdatedFired?.Invoke(this, downloadItem);
    }
}

最后它像这样工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2023-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多