如何解决在默认的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将在应用程序顶部打开一个空白窗口,然后打开保存文件对话框。当您在文件对话框中按保存时,它将关闭,但空白窗口保持打开状态。
我要执行以下操作:
-
没有打开空白窗口。
-
检测正在下载的文件类型/ MIME(我的应用仅加载我的网站),如果它们是PDF,TXT或DOCX,则自动下载到临时位置,而不会显示保存对话框,并在操作系统默认查看器。
-
如果不是上述类型之一,则显示“保存文件”对话框,并允许用户下载到所需位置。
我可以找出如何在默认的OS查看器中单独打开文件的方法,我想在这里着重于自动下载特定文件类型。
我花了数小时寻找如何做到这一点的例子,空手而归。
我以为我可以在DownloadHandler.OnBeforeDownload中检测文件的类型,然后根据以下内容,只需在回调中将showDialogue设置为false,然后在DownloadHandler.OnDownloadUpdated中检测到downloadItem.IsComplete,然后启动文件的类型是否正确。
Force CEFSharp to download without showing dialog
但是,当我尝试这样做时,我遇到了以下问题:
-
空白窗口仍会打开并保持打开状态。
-
我发现,如果我在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 举报,一经查实,本站将立刻删除。