使用 CefSharp 上传文件

本文关键字:文件 CefSharp 使用 | 更新日期: 2023-09-27 18:35:03

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

  • 我们在页面上有一个文件上传对话框,通常用户会在其中选择一个文件。这工作正常,我们通过 IDialogHandler 拦截对话框调用并提供文件。
  • 现在我们要触发相同的对话框并预设文件。当对话框从"ExecuteScriptAsync"调用成功打开时,我们无法预先选择该文件。可能是由于以下原因:如何使用文件路径 html5 创建/初始化文件对象
  • 我们的下一个想法是让对话框正常打开并以编程方式发出 click 事件,以便浏览器打开文件对话框(然后我们将通过 IDialogHandler 捕获并提供我们想要的文件(。
  • 尝试这种方法,我们的观察如下:
  • 在用户操作(例如,在浏览器中单击按钮(之后,我们可以以编程方式"单击"文件输入按钮。
  • 从通过 ExecuteScriptAsync 发起的调用中执行相同的操作,对话框(或 IDialogHandler 中的调用(不会出现。

使用 CefSharp 上传文件

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

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

这可能是由于适用于普通 JavaScript 的相同安全限制:Chrome 中以编程方式打开上传文件对话框

我认为您需要:

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

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

阿贾克斯上传上传