HarmonyOS鸿蒙Next中web和H5交互图片的base64数据

HarmonyOS鸿蒙Next中web和H5交互图片的base64数据 web和H5交互图片的base64数据

3 回复

参考如下demo:

//.ets文件

import web_webview from '@ohos.web.webview';
import business_error from '@ohos.base';
import { buffer } from '@kit.ArkTS';
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { fileUri } from "@kit.CoreFileKit";
import { hilog } from '@kit.PerformanceAnalysisKit';

let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;

// data为需要转换的base64字符串,返回沙箱路径uri
export async function writeFile(data: string): Promise<string> {
    let uri = '';
    try {
        let filePath = filesDir + "/1.png";
        uri = fileUri.getUriFromPath(filePath);
        let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
        console.info("file fd: " + file.fd);
        const reg = new RegExp("data:image/\\w+;base64,");
        const base64 = data.replace(reg, "");
        console.log("base64flag", base64)
        const dataBuffer = buffer.from(base64, 'base64')
        let writeLen = fileIo.writeSync(file.fd, dataBuffer.buffer);
        hilog.info(0xA0c0d0,'uri',uri)
        fileIo.closeSync(file);
    } catch (Error) {
        hilog.error(0xA0c0d0,'Error',Error.code)
    }
    return uri;
}

class User {
    private name: string = "LiHua"
    private age: number = 0
    constructor() {}
    getNameWithAge(): string {
        return `name:${this.name},age:${this.age}`
    }
}

@Entry
@Component
struct Index {
    controller: web_webview.WebviewController = new web_webview.WebviewController();
    @State user: User = new User()
    @State sendFromEts: string = 'Send this message from ets to HTML';
    @State receivedFromHtml: string = 'Display received message send from HTML';

    ports: web_webview.WebMessagePort[] = [];

    writeFile1(data:string){
        let uri = '';
        try {
            let filePath = filesDir + "/1.png";
            uri = fileUri.getUriFromPath(filePath);
            let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
            console.info("file fd: " + file.fd);
            const reg = new RegExp("data:image/\\w+;base64,");
            const base64 = data.replace(reg, "");
            console.log("base64flag", base64)
            this.sendFromEts = base64
            const dataBuffer = buffer.from(base64, 'base64')
            let writeLen = fileIo.writeSync(file.fd, dataBuffer.buffer);
            hilog.info(0xA0c0d0,'uri',uri)
            fileIo.closeSync(file);
        } catch (Error) {
            hilog.error(0xA0c0d0,'Error',Error.code)
        }
        return uri;
    }

    aboutToAppear(){
        // 配置Web开启调试模式
        web_webview.WebviewController.setWebDebuggingAccess(true);
    }

    build(){
        Column () {
            // 通信,展示接收到的来自HTML的内容
            Text(this.receivedFromHtml)
            // 输入框的内容发送到HTML
            TextInput({ placeholder: 'Send this message from ets to HTML' })
                .onChange((value: string) => {
                    this.sendFromEts = value;
                })
            Button("调用h5的方法").onClick(() => this.controller.runJavaScript('setH1Title()'))
            //注册
            Button('注册')
                .onClick(() => {
                    try {
                        // 1、创建两个消息端口。
                        this.ports = this.controller.createWebMessagePorts();
                        // 2、在应用侧的消息端口(如端口1)上注册回调事件。
                        this.ports[1].onMessageEvent((result: web_webview.WebMessage) => {
                            let msg = 'Got msg from HTML:';
                            if (typeof(result) === 'string') {
                                console.info(`received string message from html5, string is: ${result}`);
                                msg = msg + result;
                            } else if (typeof(result) === 'object') {
                                if (result instanceof ArrayBuffer) {
                                    console.info(`received arraybuffer from html5, length is: ${result.byteLength}`);
                                    msg = msg + 'length is ' + result.byteLength;
                                } else {
                                    console.info('not support');
                                }
                            } else {
                                console.info('not support');
                            }
                            this.receivedFromHtml = msg;
                        })
                        // 3、将另一个消息端口(如端口0)发送到HTML侧,由HTML侧保存并使用。
                        this.controller.postMessage('__init_port__', [this.ports[0]], '*');
                    } catch (error) {
                        let e: business_error.BusinessError = error as business_error.BusinessError;
                        console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
                    }
                })
            // 4、使用应用侧的端口给另一个已经发送到html的端口发送消息。
            Button('SendDataToHTML')
                .onClick(() => {
                    try {
                        if (this.ports && this.ports[1]) {
                            this.writeFile1('测试测试')
                            this.ports[1].postMessageEvent(this.sendFromEts);
                        } else {
                            console.error(`ports is null, Please initialize first`);
                        }
                    } catch (error) {
                        let e: business_error.BusinessError = error as business_error.BusinessError;
                        console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
                    }
                })
            // 组件创建时,通过$rawfile加载本地文件local.html
            Web({ src: $rawfile("index1.html"), controller: this.controller })
            // 将对象注入到web端
            .javaScriptProxy({
                object: this.user,
                name: "user",
                methodList: ["getNameWithAge"],
                controller: this.controller
            })
        }
        .width("100%")
        .height("100%")
    }
}

更多关于HarmonyOS鸿蒙Next中web和H5交互图片的base64数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,Web和H5交互时,可以通过JavaScript与原生代码进行通信来实现图片的base64数据传递。具体步骤如下:

  1. Web端发送base64数据:在H5页面中,通过JavaScript将图片转换为base64字符串,并通过postMessage方法将数据发送给原生代码。
function sendBase64Data() {
    const img = document.getElementById('image');
    const canvas = document.createElement('canvas');
    canvas.width = img.width;
    canvas.height = img.height;
    const ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);
    const base64Data = canvas.toDataURL('image/png');
    window.webkit.messageHandlers.nativeHandler.postMessage(base64Data);
}
  1. 原生端接收base64数据:在鸿蒙原生代码中,通过注册消息处理器来接收H5页面发送的base64数据。
import web_webview from '@ohos.web.webview';

export class MyWebView extends web_webview.WebviewController {
    constructor() {
        super();
        this.registerHandler();
    }

    private registerHandler() {
        this.getWebview().getJavaScriptProxy().registerHandler('nativeHandler', (data) => {
            const base64Data = data as string;
            // 处理base64数据
        });
    }
}
  1. 原生端处理base64数据:接收到base64数据后,可以将其转换为图片文件或直接使用。
function processBase64Data(base64Data: string) {
    const base64Image = base64Data.split(';base64,').pop();
    const imageBuffer = Buffer.from(base64Image, 'base64');
    // 保存或处理imageBuffer
}

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现Web和H5之间的图片base64数据交互。

在HarmonyOS鸿蒙Next中,Web和H5交互时传递图片的base64数据可以通过以下步骤实现:

  1. 获取图片的base64数据:在前端使用JavaScript将图片转换为base64编码。例如,使用FileReader读取图片文件并调用readAsDataURL方法。

  2. 传递数据:通过postMessageWebView的JavaScript接口将base64数据发送到原生应用。

  3. 接收与处理:在原生端通过WebViewonMessage回调接收数据,并进行解码和显示。

示例代码:

// 前端
const img = document.getElementById('image');
const reader = new FileReader();
reader.onload = function(e) {
    const base64 = e.target.result;
    window.parent.postMessage(base64, '*');
};
reader.readAsDataURL(img.files[0]);

// 原生端
webView.setWebMessageListener((message) => {
    String base64Data = message.getData();
    // 处理base64数据
});

通过这种方式,可以在Web和H5之间高效传递图片的base64数据。

回到顶部