最近用到了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);
如果沒有這兩行代碼就會有很大幾率出現異常...