2014-12-23 95 views
1

我們在C#WinForms應用程序中使用CefSharp(v37.0.0 NuGet包)。我們正在尋找一種方式(以編程方式)觸發文件上傳操作。如果可以的話,該怎麼辦? 了一些額外的想法:使用CefSharp進行文件上傳

  • 我們有一個頁面上的文件上傳對話框,在這裏,通常情況下,用戶會選擇一個文件。這工作正常,我們通過IDialogHandler攔截對話調用並提供文件。
  • 現在我們要觸發相同的對話框並預先設置文件。當對話框從「ExecuteScriptAsync」調用成功打開時,我們無法預先選擇文件。可能是由於以下原因:how to create/initialize the file object using file path html5
  • 我們接下來的想法是讓對話框正常打開並以編程方式發出點擊事件,以便瀏覽器打開文件對話框(然後我們將通過IDialogHandler捕獲並提供我們所需的文件) 。
  • 嘗試這種方法,我們的觀察如下:
  • 在用戶操作(例如瀏覽器內部的按鈕點擊)後,我們可以通過編程方式「點擊」文件輸入按鈕。
  • 從通過ExecuteScriptAsync發起的調用做同樣的事情,對話框(或IDialogHandler中的調用)不會出現。

回答

2

做從呼叫通過ExecuteScriptAsync,對話發起相同(或撥打IDialogHandler)不上來。

這可能是由於適用於普通的JavaScript相同的安全限制:Programmatically open upload file dialog in Chrome

我想你將需要:

  1. 在JavaScript:
    1. 滾動文件上傳按鈕到視圖中,Element.scrollIntoView()
    2. 計算文件上傳的座標b utton,Element.getBoundingClientRect()
    3. 將座標返回給C#。
  2. 在C#:
    1. 編程方式發送鼠標點擊的座標(見this question
+1

這絕對做一個明顯的方式 - 感謝指出了這一點耀西!我們現在用稍微不同的方式解決了它。我們讓用戶在html表單上點擊我們最終的「保存」按鈕。但在這種特殊情況下,我們打開「文件打開」對話框 - 這是因爲它起源於用戶操作 - 然後我們從C#中捕獲並正確設置文件。接下來,我們再次從同一個C#事件處理函數中調用save函數,它將最終運行保存/上傳邏輯。酷的東西JavaScript/.NET之間的這種緊密的交互。 – lichtalberich

-1

我可能是錯的,但是這也可以通過使用jQuery是實現文件上傳插件,而不是自己做。

阿賈克斯上傳 Uploadify

+0

http://stackoverflow.com/help/how-to-answer – RPichioli

1

在CefSharp樣本項目中的文件TempFileDialogHandler有這樣的一個例子。

public class TempFileDialogHandler : IDialogHandler 
    { 
     public bool OnFileDialog(IWebBrowser browserControl, IBrowser browser, CefFileDialogMode mode, string title, string defaultFilePath, List<string> acceptFilters, int selectedAcceptFilter, IFileDialogCallback callback) 
     { 
      callback.Continue(selectedAcceptFilter, new List<string> { Path.GetRandomFileName() }); 

      return true; 
     } 
    } 


更換Path.GetRandomFileName()您的文件路徑,然後將處理程序安裝到瀏覽器這樣的:

browser.DialogHandler = new TempFileDialogHandler(); 
相關問題