簡體   English   中英

使用 CefSharp WinForms 下載文件

[英]Download file with CefSharp WinForms

我正在嘗試使用 CefSharp WinForms 從我的應用程序下載一些文件(圖像、音頻文件或其他文件)。 我閱讀了許多其他帖子,但似乎沒有任何效果。 你有任何實現 CefSharp 下載器的示例代碼嗎?

我嘗試下載一些文件,沒有任何反應。

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);
        }
    }
}

要解決此問題,只需下載此處找到的類 DownloadHandler.cs。

之后,將其導入到您的 Visual Studio 項目中,並將此行添加到主窗體的代碼中:

MyBrowser.DownloadHandler = new DownloadHandler();

並將其添加到代碼的頂部:

using CefSharp.Example;

然后嘗試從您的瀏覽器下載一些東西,它應該可以工作!

我之所以包含以下內容,是因為 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);
        }
    }
}

// ...

將此添加到您的 MainForm 中

 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);
    }
}

最后它是這樣工作的在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM