接收二进制数据

本节示例可以参考示例文件"CaseStudy\WebViewer\接收消息.Table"的窗口"二进制数据"。

chrome.webview.postMessage方法只能发送字符串(对象也是序列化成JSON字符串后发送)。

如果要发送二进制数据,可以将数据转换为base64字符串然后发送,在Foxtable端将收到的base64字符串还原成二进制数据。

本节示例在前端基于Canvas合计了一个简单的绘图程序,绘制完成后,单击"发送Canvas图片到Foxtable",既可以将绘制结果发给Foxtable,由Foxtable负责将图片保存为本地文件。

1、窗口的AfterLoad事件代码:

'''Async
Dim
wv As WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing) '初始化浏览器
'
定义测试页面
Dim
html As String = <![CDATA[
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Canvas
手绘与Base64发送</title>
    <style>
        body { font-family: Arial; padding: 16px; }
        canvas { border: 1px solid #ccc; cursor: crosshair; }
        button { margin-top: 10px; }
    </style>
</head>
<body>
    <h3>Canvas
手绘示例</h3>
    <canvas id="myCanvas" width="500" height="400"></canvas>
    <br /><br />
    <button onclick="sendCanvasImage()">
发送Canvas图片到Foxtable</button>
    <script>
        const canvas = document.getElementById('myCanvas');
        const ctx = canvas.getContext('2d');
        let drawing = false;
        //
设置线条样式
        ctx.lineWidth = 5;
        ctx.lineJoin = ctx.lineCap = 'round';
        ctx.strokeStyle = '#4CAF50'; //
线条颜色
        //
开始绘制
        canvas.addEventListener('mousedown', function(e) {
            drawing = true;
            ctx.beginPath();
            ctx.moveTo(e.offsetX, e.offsetY);
        });
        //
绘制中
        canvas.addEventListener('mousemove', function(e) {
            if (!drawing) return;
            ctx.lineTo(e.offsetX, e.offsetY);
            ctx.stroke();
        });
        //
停止绘制
        canvas.addEventListener('mouseup', function() {
            if (drawing) {
                ctx.closePath();
                drawing = false;
            }
        });
         //
取消绘制(当鼠标移出canvas区域)
        canvas.addEventListener('mouseout', function() {
            drawing = false;
        });
        //
发送Canvas图像数据
        function sendCanvasImage() {
            const dataUrl = canvas.toDataURL('image/png');
            window.chrome.webview.postMessage({
                command: "save_canvas_image",
                imageData: dataUrl
            });
        }
    </script>
</body>
</html>
]]>
.Value
wv.CoreWebView2.NavigateToString(html)
'打开测试页面

2、WebMessageReceived事件代码:

Try
   
Dim jo As JObject = JsonConvert.DeserializeObject(e.WebMessageAsJson)
   
Dim command As String = jo("command").ToString()
   
If command = "save_canvas_image" Then
       
Dim dataUrl As String = jo("imageData").ToString()
       
If String.IsNullOrEmpty(dataUrl) Then
            MessageBox.Show(
"图像数据为空")
           
Return
       
End If
       
Dim prefix As String = "data:image/png;base64,"
       
If Not dataUrl.StartsWith(prefix) Then
            MessageBox.Show(
"无效的图像格式")
           
Return
       
End If
       
Dim base64 As String = dataUrl.Substring(prefix.Length)
       
Dim imageBytes As Byte() = Convert.FromBase64String(base64)
       
Dim saveFolder As String = "C:\temp"
       
If Not FileSys.DirectoryExists(saveFolder) Then
                FileSys.CreateDirectory(saveFolder)
           
End If
       
Dim saveFile As String = saveFolder & "\canvas_image.png"
        FileSys.WriteAllBytes(saveFile, imageBytes,
False)
        MessageBoxA.Show(
"文件已经保存在目录'c:\temp'", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) '必修用MessageBoxA
   
End If
Catch
ex As Exception
    MessageBoxA.Show(
"处理失败:" & ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) '必修用MessageBoxA
End
Try

重要提醒

在WebViewer的事件代码中使用的对话框,必须是异步对话框,例如这里的MessageBoxA,因为普通对话框会阻塞进程,导致WebViewer崩溃。

关于异步对话框,请参考:异步对话框


本页地址:http://www.foxtable.com/webhelp/topics/6230.htm