web-dev-qa-db-ja.com

cefsharp winformsでファイルをダウンロードする

アプリからcefsharp winformsを使用してファイル(画像、ファイルオーディオなど)をダウンロードしようとしています。他の投稿を読みましたが、何も動作しないようです。 cefsharpのダウンローダーを実装するためのサンプルコードはありますか?

もちろん、今いくつかのファイルをダウンロードしようとしても、何も起こりません。

ありがとう

15
crasholino

2日後、ようやくやった。同じ問題を抱えている人々のために、ここに簡単な解決策があります。 MinimalExampleを使用している場合は、Cefsharpの例(cefsharp-master)をダウンロードして解凍し、これを行う必要があります。

  1. プロジェクトを右クリック->既存のアイテムを追加
  2. Cefsharp-master-> CefSharp.example-> Select DownloadHandler.csに移動します
  3. BrowserForm.csクラスに移動して、次のように入力します。

    browser.DownloadHandler = new DownloadHandler();

  4. できた!



DownloadHandler.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);
        }
    }
}
12
crasholino

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

// ...
8
Eric Twose