将 Cefsharp 中的文件下载到允许用户打开的目录

Ben*_*min 6 c# download cefsharp

我正在构建一个原始和基本的 Web 浏览器,我的工作场所希望在其上托管一些内部应用程序。我cefSharp在用 C# 编写的 WinForms 应用程序中使用。我已经成功地构建了浏览器来导航应用程序,但我在下载处理程序方面遇到了问题。我想将文件直接下载到C:\Users\[username]\Downloads文件夹(我们所有的计算机是 Windows 计算机)而无需使用对话框。

Force CEFSharp to download without show dialog读取表明使用showDialog: false应该可以工作,但是当我应用它时,没有任何下载。同样,通过研究以下任何一项,我也没有取得任何进展:

作为奖励,可以选择打开文件(例如在 Google Chrome 中)会很好,但这并不是绝对必要的。

下面的代码运行顺利,并近似于我正在尝试的内容。此示例打开 GitHub Gist。单击右侧的“下载 Zip”按钮将打开对话框以下载并保存文件。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.IO;

namespace ShinyChrome
{
    public partial class ShinyApp : Form
    {
        public class DownloadHandler : IDownloadHandler
        {
            public event EventHandler<DownloadItem> OnBeforeDownloadFired;

            public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

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

        public ShinyApp()
        {
            InitializeComponent();
        }

        ChromiumWebBrowser chrome;

        private void ShinyApp_Load(object sender, EventArgs e)
        {   
            CefSettings settings = new CefSettings();
            Cef.Initialize(settings);
            chrome = new ChromiumWebBrowser("https://gist.github.com/nutterb/32992747c1a69aa7a8fdcc2b5347178f");
            chrome.DownloadHandler = new DownloadHandler();
            this.shinyContainer.Controls.Add(chrome);
        }



    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*min 2

根据 TEK 的建议,我if(!callback.IsDisposed)用下面的代码替换了问题中的块。

if (!callback.IsDisposed)
                {
                    using (callback)
                    {
                        callback.Continue(@"C:\Users\" + 
                                System.Security.Principal.WindowsIdentity.GetCurrent().Name. + 
                                @"\Downloads\" + 
                                downloadItem.SuggestedFileName, 
                            showDialog: false);
                    }
                }
Run Code Online (Sandbox Code Playgroud)