4

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

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

3 回答 3

4

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();
于 2018-01-10T20:31:46.570 回答
3

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

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

我认为您将需要:

  1. 在 JavaScript 中:
    1. 将文件上传按钮滚动到视图中,Element.scrollIntoView()
    2. 计算文件上传按钮的坐标,Element.getBoundingClientRect()
    3. 将坐标返回到 C#。
  2. 在 C# 中:
    1. 以编程方式将鼠标单击发送到坐标(请参阅此问题
于 2014-12-29T07:05:49.923 回答
-2

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

Ajax 上传 Uploadify

于 2016-11-08T14:08:53.823 回答