1、实现 IDialogHandler接口
使用CefSharp 实现模拟上传选择文件,需要实现IDialogHandler
接口中 OnFileDialog(IWebBrowser chromiumWebBrowser, IBrowser browser, CefFileDialogMode mode, CefFileDialogFlags flags, string title, string defaultFilePath, List<string> acceptFilters, int selectedAcceptFilter, IFileDialogCallback callback)
方法。
具体如下:
using CefSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebBrowser.OperateTask.Utils;
namespace CJavapy
{
public class UploadFileDialogHandler : IDialogHandler
{
public bool OnFileDialog(IWebBrowser chromiumWebBrowser, IBrowser browser, CefFileDialogMode mode, CefFileDialogFlags flags, string title, string defaultFilePath, List<string> acceptFilters, int selectedAcceptFilter, IFileDialogCallback callback)
{
callback.Continue(selectedAcceptFilter, new List<string> { @"E:\softwaredir\img\4.mp4" });
return true;
}
}
}
2、配置使用UploadFileDialogHandler处理文件上传
ChromiumWebBrowser
对象的DialogHandler
属性,需要配置成UploadFileDialogHandler
,在CefSharp
中,点击上传按钮时,就会触发执行上面实现的OnFileDialog()
方法,返回的值就是要上传文件的路径,可以是多个路径,此时就会弹出打开选择文件的对话窗口,而是直接后台返回。
配置代码如下:
CefSettings settings = new CefSettings();
settings.CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), ConfigurationManager.AppSettings["CookiePath"], "CEF");
settings.IgnoreCertificateErrors = true;
settings.WindowlessRenderingEnabled = true;
settings.SetOffScreenRenderingBestPerformanceArgs();
settings.UserAgent = string.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["UserAgent"]) ? "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1" : ConfigurationManager.AppSettings["UserAgent"];
//settings.CefCommandLineArgs.Add("-touch-devices", "enabled");
//settings.CefCommandLineArgs.Add("-touch-events", "enabled");
//settings.CefCommandLineArgs.Add("-enable-pinch", "enabled");
//settings.CefCommandLineArgs.Add("-touchview", "enabled");
//settings.CefCommandLineArgs.Add("-touch-view", "enabled");
//settings.CefCommandLineArgs.Add("-material-hybrid", "enabled");
//settings.CefCommandLineArgs.Add("touch-devices", "enabled");
//settings.CefCommandLineArgs.Add("touch-events", "enabled");
//settings.CefCommandLineArgs.Add("enable-pinch", "enabled");
//settings.CefCommandLineArgs.Add("touchview", "enabled");
//settings.CefCommandLineArgs.Add("touch-view", "enabled");
//settings.CefCommandLineArgs.Add("material-hybrid", "enabled");
Cef.Initialize(settings);
ChromiumWebBrowser browser = new ChromiumWebBrowser(ConfigurationManager.AppSettings["LoginUrl"]);
browser.DialogHandler = new UploadFileDialogHandler();