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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值