目前版本的webview2的PostWebMessageAsJson(string webMessageAsJson, System.Collections.Generic.List<object> additionalObjects)方法支持一个additionalObjects参数,可以用来向浏览器窗口发送本地文件。
具体说来,additionalObject的内容应为CoreWebView2FileSystemHandle列表,可以通过wv.CoreWebView2.Environment.CreateWebFileSystemFileHandle或wv.CoreWebView2.Environment.CreateWebFileSystemDirectoryHandle由路径字符串创建。如果有Webview2对象wv和文件路径列表paths,可以在C#中通过
wv.CoreWebView2.PostWebMessageAsJson(
JsonConvert.SerializeObject(new {
op = "customMessage"
}),
paths.Select(x => {
string path = (string)x;
if(File.Exists(path))
return wv.CoreWebView2.Environment.CreateWebFileSystemFileHandle(path, CoreWebView2FileSystemHandlePermission.ReadOnly);
else if(Directory.Exists(path))
return wv.CoreWebView2.Environment.CreateWebFileSystemDirectoryHandle(path, CoreWebView2FileSystemHandlePermission.ReadOnly);
return null;
}).ToList<object>()
);
的方式将文件(夹)句柄发送到webview窗口。
窗口可以从chrome.webviewmessage事件中的event.additionalObjects中以FileSystemFileHandle的形式获取文件(夹)句柄,从而读取本地文件。
希望 WebView2浏览器窗口 的 发送消息 模块可以增加一个参数,可以将用户提供的文件列表发送给webview2窗口,从而能在不通过剪贴板中转、不额外使用C#脚本的情况下向webview窗口提供文件。