2014-12-23 94 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(); 
相关问题