使用CefSharp上传文件

时间:2014-12-23 13:45:12

标签: c# cefsharp

我们在C#WinForms应用程序中使用CefSharp(v37.0.0 NuGet包)。我们正在寻找一种(以编程方式)触发文件上载操作的方法。如果有的话,怎么办呢? 还有一些额外的想法:

  • 我们在页面上有一个文件上传对话框,通常用户会选择一个文件。这很好用,我们通过IDialogHandler截取对话框调用并提供文件。
  • 现在我们要触发相同的对话框并预先设置文件。从“ExecuteScriptAsync”调用成功打开对话框时,我们无法预先选择该文件。可能是由于以下原因:how to create/initialize the file object using file path html5
  • 我们的下一个想法是让对话框正常打开并以编程方式发出点击事件,以便浏览器打开文件对话框(然后我们将通过IDialogHandler捕获并提供我们想要的文件)。
  • 尝试这种方法,我们的观察结果如下:
  • 在用户操作后(例如,在浏览器中单击按钮),我们可以通过编程方式“单击”文件输入按钮。
  • 通过ExecuteScriptAsync发起的呼叫执行相同操作,对话框(或IDialogHandler中的调用)不会出现。

3 个答案:

答案 0 :(得分:2)

  

通过ExecuteScriptAsync发起的呼叫执行相同操作,对话框(或IDialogHandler中的调用)不会出现。

这可能是由于适用于普通JavaScript的相同安全限制:Programmatically open upload file dialog in Chrome

我认为你需要:

  1. 在JavaScript中:
    1. 将文件上传按钮滚动到视图中Element.scrollIntoView()
    2. 计算文件上传按钮Element.getBoundingClientRect()
    3. 的坐标
    4. 将坐标返回C#。
  2. 在C#中:
    1. 以编程方式将鼠标单击发送到坐标(请参阅this question

答案 1 :(得分:2)

CefSharp示例项目中的文件NavigationActions就是一个例子。

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

答案 2 :(得分:-2)

我可能错了,但这也可以通过使用jquery文件上传器插件来实现,而不是自己动手。

Ajax上传 Uploadify