アプリからcefsharp winformsを使用してファイル(画像、ファイルオーディオなど)をダウンロードしようとしています。他の投稿を読みましたが、何も動作しないようです。 cefsharpのダウンローダーを実装するためのサンプルコードはありますか?
もちろん、今いくつかのファイルをダウンロードしようとしても、何も起こりません。
ありがとう
2日後、ようやくやった。同じ問題を抱えている人々のために、ここに簡単な解決策があります。 MinimalExampleを使用している場合は、Cefsharpの例(cefsharp-master)をダウンロードして解凍し、これを行う必要があります。
BrowserForm.csクラスに移動して、次のように入力します。
browser.DownloadHandler = new DownloadHandler();
できた!
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);
}
}
}
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);
}
}
}
// ...