首页 > 其他分享 >WebView2 系列之-前端向后端传递文件对象

WebView2 系列之-前端向后端传递文件对象

时间:2024-04-08 23:45:33浏览次数:28  
标签:postMessage files 前端 WebView2 传递 file message

背景

WebView2 中,前端到后端的消息传递,通常是不支持传递对象的。但是我在查阅官方文档时发现了一个例外,那就是方法postMessageWithAdditionalObjects

如何传递附加对象

webview2中,前端 js 向后端传递消息通常使用 window.chrome.webview.postMessage 方法,postMessage的定义如下:

     /**
     * When the page calls postMessage, the message parameter is converted to JSON and is posted
     * asynchronously to the WebView2 host process. This will result in either the
     * CoreWebView2.WebMessageReceived event or the CoreWebView2Frame.WebMessageReceived event being
     * raised, depending on if postMessage is called from the top-level document in the WebView2
     * or from a child frame. See CoreWebView2.WebMessageReceived( Win32/C++, .NET, WinRT).
     * See CoreWebView2Frame.WebMessageReceived( Win32/C++, .NET, WinRT).
     * @param message The message to send to the WebView2 host. This can be any object that can be
     *                serialized to JSON.
     */
    postMessage(message: any) : void;

当我们使用postMessage传递任何数据类型时,都将被转为 json 字符串进行传递。

postMessageWithAdditionalObjects 接受两个参数,第一个参数和postMessage的参数一样,第二个参数允许传递一个 js 对象列表,它会被转换为原生代码中对应的类。

/**
     * When the page calls `postMessageWithAdditionalObjects`, the `message` parameter is sent to WebView2 in the same
     * fashion as {@link WebView.postMessage}.
     * Objects passed as 'additionalObjects' are converted to their native types and will be available in the
     * `CoreWebView2WebMessageReceivedEventArgs.AdditionalObjects` property.
     * @param message The message to send to the WebView2 host. This can be any object that can be serialized to JSON.
     * @param additionalObjects A sequence of DOM objects that have native representations in WebView2.
     * This parameter needs to be ArrayLike.
     *
     * The following DOM types are mapped to native:
     * DOM    | Win32              | .NET                | WinRT
     * ------ | ------------------ | ------------------- | ---------------------------
     * File   | ICoreWebView2File  | System.IO.FileInfo  | Windows.Storage.StorageFile
     *
     * `null` or `undefined` entries will be passed as `null` type in WebView2. Otherwise if an invalid or unsupported
     * object is passed via this API, an exception will be thrown and the message will fail to post.
     */
    postMessageWithAdditionalObjects(message: any, additionalObjects: ArrayLike<any>): void;

使用示例

经测试,目前只支持前端的File类型,使用示例如下:

前端:

 <input id="file" type="file" value="选择文件" accept="*/*"/>
import {onMounted} from "vue";

onMounted(() => {
  const file = document.querySelector("#file") as HTMLInputElement | null;
  file?.addEventListener("change", () => {
    console.log(file.files);
    if (file.files != null) {
      window.chrome.webview.postMessageWithAdditionalObjects("files", file.files);//files的类型是 FileList
    }
  })
})

后端接收的方法:

#region 监听前端消息

webview.CoreWebView2.WebMessageReceived += CoreWebView2OnWebMessageReceived;

#endregion

private void CoreWebView2OnWebMessageReceived(object? sender, CoreWebView2WebMessageReceivedEventArgs e)
{
    var message = e.TryGetWebMessageAsString();
    var objs = e.AdditionalObjects;
    var a = e.Source;
    Debug.WriteLine(JsonSerializer.Serialize(objs[0]));
}

当前端选择一个图片时,前端打印选择的结果:

image

传递给后端,后端接收到的数据:

image

前端从file.files拿到的数据是没有路径的,传给后端后有了完整路径,是不是很神奇。

标签:postMessage,files,前端,WebView2,传递,file,message
From: https://www.cnblogs.com/sq800/p/18122762

相关文章

  • Web 前端
    web标准:构成:语言说明结构HTML页面元素和内容表现CSS网页元素的外观和位置等页面样式(颜色,大小)行为JavaScript网页模型的定义与页面交互注释:ctrl + / 文本格式化标签介绍:场景:需要让文字加粗,下划线,倾斜,删除线等效果b加粗strong加粗u下划线ins下划线i倾斜em倾斜......
  • 前端【Vuex】【使用介绍】
    1、组件下载vue与vuex的版本对应关系: Vue2匹配的Vuex3 Vue3匹配的Vuex4Vuex是一个专为Vue.js应用程序开发的状态管理模式+库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。官方网......
  • 一文详解ThreadLocal与线程间的数据传递
    一.ThreadLocalThreadLocal在并发编程中比较常用,在诸多中间件的源码中都能看到它的身影。对于ThreadLocal的说明先来一段官方解释:ThreadLocal提供的是一种线程局部变量。这些变量不同于其它变量的点在于每个线程在获取变量的时候,都拥有它自己相对独立的变量副本。ThreadLo......
  • 前端【Vant】01-移动端组件库
    1、介绍Vant是一个轻量、可靠的移动端组件库,于2017年开源。目前Vant官方提供了 Vue2版本、Vue3版本和微信小程序版本,并由社区团队维护 React版本和支付宝小程序版本。2、安装1#Vue3项目,安装最新版Vant:2npmivant-S34#Vue2项目,安装Vant......
  • 前端【VUE】09-vue【Eslint】
    一、ESLint在vscode插件中搜索ESLint,https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint 什么是ESLint官方概念:ESLint是可组装的JavaScript和JSX检查工具。通俗理解:一个工具,用来约束团队成员的代码风格。当通过@vue......
  • 前端【VUE】08-vue【插槽】【默认插槽】【具名插槽】【作用域插槽】
    1、默认插槽默认插槽对应的插槽的名字为default  1、组件目录下components/MyDialog.vue1<template>2<divclass="dialog">3<divclass="dialog-header">4<h3>友情提示</h3>5<spanclass="close......
  • Chrome浏览器前端开发调试时强制更新js、css静态资源文件缓存的方法
    以Chrome浏览器为例,国产浏览器未做全面测试。前端开发静态文件时,浏览器访问会缓存样式、图片、js等,怎么快速更新缓存。以下方法特别适合只想清除某个网页的缓存,而不想清除全部浏览器缓存可以采用以下方法。一、强制刷新同时按住ctrl+f5或ctrl+shift+r进行访问页面强制刷新,一般......
  • 前端学习<四>JavaScript基础——11-流程控制语句:选择结构(if和switch)
    代码块用{}包围起来的代码,就是代码块。在ES5语法中,代码块,只具有分组的作用,没有其他的用途。代码块中的内容,在外部是完全可见的。举例: {   vara=2;   alert('qianguyihao');   console.log('千古壹号'); } ​ console.log('a='+a);打印结......
  • 前端学习<四>JavaScript基础——10-运算符
    我们在前面讲过变量,本文讲一下运算符和表达式。运算符的定义和分类运算符的定义运算符:也叫操作符,是一种符号。通过运算符可以对一个或多个值进行运算,并获取运算结果。表达式:数字、运算符、变量的组合(组成的式子)。表达式最终都会有一个运算结果,我们将这个结果称为表达式的......
  • 前端师傅裸辞离开,留下我奋斗在前端一线...
    原因我在半年前入职xxxx,遇见了我的贵人,6年前端经验的程序员,具体信息不多说,从我入公司就是跟在他屁股后面学习,基本有问必答对我前端技术的提升简直可以用外挂形容,最近公司动荡不用说,基本各位公司多少都得晃两下,然后师傅也和上司有点摩擦,基本俩人在场,那气氛都是肉眼可见的尴尬,......