天天看點

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

如果沒有這兩行代碼就會有很大幾率出現異常...

繼續閱讀