HarmonyOS 鸿蒙Next:webview如何拦截本地文件,例如图片资源

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:webview如何拦截本地文件,例如图片资源

【关键字】

webview / 拦截 / 本地文件 / 图片 / 沙盒目录

【问题描述】

webview页面要加载一个自定义协议资源,通过onInterceptRequest可以拦截到请求,此资源对应的是沙盒的一个文件,例如一张图片,onInterceptRequest中如何返回这个图片资源,WebResourceResponse里面只有setResponseData(data: string | number)。对比安卓,可以直接设置一个流。webview如何拦截本地图片文件?

【解决方案】

通过onInterceptRequest可以拦截到请求,再从沙箱路径替换图片的demo示例如下。

import web_webview from '@ohos.web.webview';
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import axios from '@ohos/axios'

@Entry
@Component
struct GetFile {

@State message: string = 'Hello World';
// 获取应用文件路径
context = getContext(this) as common.UIAbilityContext;
webviewController: web_webview.WebviewController = new web_webview.WebviewController();
responseweb: WebResourceResponse = new WebResourceResponse()
aboutToAppear() {
// 配置Web开启调试模式
web_webview.WebviewController.setWebDebuggingAccess(true);
}

hasFile(filePath:string){
let b = fs.accessSync(filePath)
return b
}

async getFile(url : string) {
const fileName = url.split("/").pop();
const filePath = this.context.cacheDir +'/' +fileName;

const flag=this.hasFile(filePath);
console.log(flag+"123456")
if(!flag){
await this.downloadImage(url, filePath);
}
let file = await fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let arrayBuffer = new ArrayBuffer(4096);
return file.fd;
}
@Entry
@Component
struct GetFile {

@State message: string = 'Hello World';
// 获取应用文件路径
context = getContext(this) as common.UIAbilityContext;
webviewController: web_webview.WebviewController = new web_webview.WebviewController();
responseweb: WebResourceResponse = new WebResourceResponse()
aboutToAppear() {
// 配置Web开启调试模式
web_webview.WebviewController.setWebDebuggingAccess(true);
}

hasFile(filePath:string){
let b = fs.accessSync(filePath)
return b
}

async downloadImage(url : string, filePath:string) {
try {
await axios({
method: "get",
url,
context: this.context,
filePath: filePath });
} catch (error) {
console.error('[Demo] axios error');
}
}
build() {
Column () {
Web({ src: $rawfile('catch.html'), controller: this.webviewController })
.onInterceptRequest((event) => {
if (event) {
}
const url = event!.request.getRequestUrl();
console.log(url.endsWith(".jpg") + '123456')
if (!url.endsWith(".jpg")) return null;
try {
let url2='https://img.tukuppt.com/photo-big/17/12/16/57/94/171216579483.jpg';
this.getFile(url2).then(fd => {
this.responseweb.setResponseData(fd);
this.responseweb.setResponseCode(200);
this.responseweb.setReasonMessage('OK');
this.responseweb.setResponseIsReady(true);
});
this.responseweb.setResponseMimeType('image/*');
this.responseweb.setResponseIsReady(false);
console.log(this.responseweb.getResponseData().toString+"123456")
return this.responseweb;
} catch (error) {
console.error(`[Demo]Code: ${error.code},Message: ${error.message} `);
return null
}
})
}
}

更多关于HarmonyOS 鸿蒙Next:webview如何拦截本地文件,例如图片资源的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next:webview如何拦截本地文件,例如图片资源的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,针对webview拦截本地文件(如图片资源)的需求,可以通过以下方式实现:

HarmonyOS提供了丰富的API和组件来管理webview的行为。为了拦截webview加载本地文件,你可以利用webview的加载拦截机制。具体地,你可以通过实现WebResourceRequest的回调接口,在资源请求时进行检查和过滤。

  1. 配置WebView: 首先,确保你的WebView已经正确初始化并配置在你的应用中。

  2. 实现WebResourceRequest拦截: 通过重写WebViewClient的shouldInterceptRequest方法,你可以拦截webview发出的所有资源请求。在这个方法中,你可以检查请求的URL,如果是本地文件(例如以"file://"开头的URL),则可以选择不加载这些资源,或者返回一个替代的资源。

  3. 处理拦截结果: 根据业务需求,你可以决定是返回null(表示不加载该资源),还是返回一个WebResourceResponse对象(表示加载一个替代的资源)。

请注意,上述方法依赖于HarmonyOS提供的WebView组件和API。如果你在实现过程中遇到特定的问题或错误,可能是由于API使用不当或系统限制导致的。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部