天天看点

GeckoFx v45浏览器控件实现文件下载出现异常的解决办法

最近用到了GeckoFx的下载功能, 从网络上找到了一些代码复制运行, 发现有时候会报COM调用错误的异常, 经查找发现是GeckoFx的接口发生更新了, 之前的接口已经弃用, 下面贴上经测试可用代码:

首先先 注册下载事件:

Gecko.LauncherDialog.Download += this.LauncherDialog_Download;
           

然后实现下载事件方法:

private void LauncherDialog_Download(Object sender, Gecko.LauncherDialogEvent e)
{
	uint flags = (uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_NO_CONVERSION |
		(uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
		(uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_BYPASS_CACHE;

	SaveFileDialog dlg = new SaveFileDialog
	{
		FileName = e.Filename
	};
	if (dlg.ShowDialog(this.ParentForm) == DialogResult.OK)
	{
		nsIURI source = IOService.CreateNsIUri(e.Url);
		nsIURI dest = IOService.CreateNsIUri(new Uri(dlg.FileName).AbsoluteUri);
		nsAStringBase t = new nsAString(Path.GetFileName(dlg.FileName));

		nsIWebBrowserPersist persist = Xpcom.CreateInstance<nsIWebBrowserPersist>("@mozilla.org/embedding/browser/nsWebBrowserPersist;1");

		nsITransfer nst = Xpcom.CreateInstance<nsITransfer>("@mozilla.org/transfer;1");
		nst.Init(source, dest, t, e.Mime, 0, null, persist, false);

		if (nst != null)
		{
			persist.SetPersistFlagsAttribute(flags);
			persist.SetProgressListenerAttribute(nst);
			try
			{
				persist.SaveURI(source, null, null, (uint)Gecko.nsIHttpChannelConsts.REFERRER_POLICY_NO_REFERRER, null, null, (nsISupports)dest, null);
				GuiHelper.MsgBox($"文件[{Path.GetFileName(dlg.FileName)}]已下载成功!");
			}
			catch (Exception ex)
			{
				GuiHelper.MsgBox($"下载失败: {ex.Message}.");
			}
			return;
		}
		GuiHelper.MsgBox("下载失败: 服务器无响应...");
	}
}
           

与老版本代码的区别是多了下面两行代码:

nsITransfer nst = Xpcom.CreateInstance<nsITransfer>("@mozilla.org/transfer;1");
nst.Init(source, dest, t, e.Mime, 0, null, persist, false);
           

如果没有这两行代码就会有很大几率出现异常...