HarmonyOS webview如何拦截本地文件,例如图片资源?

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

HarmonyOS
2024-11-07 10:44:26
501浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Heiang

请参考下面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.huawei.com/3.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 
          } 
        }) 
    } 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
分享
微博
QQ
微信
回复
2024-11-07 15:16:55


相关问题
HarmonyOS Webview load本地资源的问题
515浏览 • 1回复 待解决
HarmonyOS 本地资源如何引用?
1022浏览 • 1回复 待解决
HarmonyOS webview如何拦截scheme的跳转
576浏览 • 1回复 待解决
HarmonyOS WebView拦截网络请求
1318浏览 • 1回复 待解决
WebView goBack事件拦截
1727浏览 • 1回复 待解决
webview如何实现网络请求拦截功能
2927浏览 • 1回复 待解决
webview拦截返回按钮。
1585浏览 • 1回复 待解决
HarmonyOS 加载本地文件目录的图片问题
1026浏览 • 1回复 待解决