在默认的OS查看器应用程序中打开从CEFSharp下载的文件

问题描述

我已经使用.NET 4.7.2和CEFSharp 84.4.10构建了Winforms应用程序。

我加载了一个网站,该网站具有指向各种文件链接包括PDF,TXT,DOCX等... 链接的html是这样的:

<a href="relative_url/filename.ext" target="_blank">icon_here</a>

例如,当我单击指向docx的链接时,它的CEFSharp将在应用程序顶部打开一个空白窗口,然后打开保存文件对话框。当您在文件对话框中按保存时,它将关闭,但空白窗口保持打开状态。

enter image description here

我要执行以下操作:

  1. 没有打开空白窗口。

  2. 检测正在下载的文件类型/ MIME(我的应用仅加载我的网站),如果它们是PDF,TXT或DOCX,则自动下载到临时位置,而不会显示保存对话框,并在操作系统认查看器。

  3. 如果不是上述类型之一,则显示“保存文件”对话框,并允许用户下载到所需位置。

我可以找出如何在认的OS查看器中单独打开文件方法,我想在这里着重于自动下载特定文件类型。

我花了数小时寻找如何做到这一点的例子,空手而归。

我以为我可以在DownloadHandler.OnBeforeDownload中检测文件的类型,然后根据以下内容,只需在回调中将showDialogue设置为false,然后在DownloadHandler.OnDownloadUpdated中检测到downloadItem.IsComplete,然后启动文件的类型是否正确。

Force CEFSharp to download without showing dialog

但是,当我尝试这样做时,我遇到了以下问题:

  1. 空白窗口仍会打开并保持打开状态。

  2. 我发现,如果我在DownloadHandler.OnDownloadUpdated中设置了一个断点,则可以看到ReceivedBytes从零到TotalBytes,并且InProgress为true,然后按F5继续以将ReceivedBytes更改回零,并且InProgress为false,但是IsComplete和IsCanceled始终保持为false。我本以为一旦下载完成,IsComplete便会成立。

我很高兴与CEFShap合作,将非常感谢您提供的任何指导或示例。

感谢您的时间。

更新1:

我尝试过的代码如下:

注意:我发现在为回调分配路径之后,在OBeforeDownload中继续操作可以修复IsComplete未被设置为true的问题。但是空白窗口打开的问题仍然存在。

在托管CEFSharp的Winform中,我初始化了控件,如下所示:

browser = new ChromiumWebbrowser("https://localhost:44393/Default.aspx");
var downloadHandler = new DownloadHandler();
browser.DownloadHandler = downloadHandler;

在DownloadHandler.cs中:

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)
            {
                //Todo: Detect file Type/Mime and auto download or show Save File dialogue as needed here
                callback.Continue(Path.Combine(@"C:\Temp",downloadItem.SuggestedFileName),showDialog: false); // set to false so we don't show 
            }
        }
    }

    public void OnDownloadUpdated(IWebbrowser chromiumWebbrowser,IDownloadItemCallback callback)
    {
        OnDownloadUpdatedFired?.Invoke(this,downloadItem);
        if (downloadItem.IsComplete)
        {
            //Todo: Detect File Type/Mime and automatically open in default OS viewer
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)