鸿蒙web加载本地网页资源异常

简介: 在鸿蒙NEXT Api 12中,为解决Web组件加载本地资源(如图片、CSS等)失败的问题,我们采用拦截机制。具体步骤如下:1. **替换路径**:通过正则表达式将HTML和CSS中的资源路径替换为带有标记的URL(如`http://local`),以便后续识别。2. **拦截与返回**:在资源加载时,拦截带有标记的URL,读取对应的本地文件并返回给Web组件。此过程确保了本地资源能正确加载和显示。代码实现包括路径替换、资源拦截及响应构建,确保Web页面能够顺利加载本地资源。


我们在使用web组件中发现本地资源,例如图片/Css等资源会有加载不成功的情况,web组件提供了一种拦截机制,可以在加载资源的时候拦截,并替换为本地资源,并回传给web组件,具体实现如下

核心就两步:

第一步,替换本地资源路径,相当于做了标记;

第二步,拦截标记过的资源,读取本地资源后并返回;

下面的所有代码是基于鸿蒙NEXT Api 12

@Component
struct WebPage {
// 跳转过来 传递的地址
urlPath: string = ""
controller = new webview.WebviewController()
schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler();
responseWeb: WebResourceResponse = new WebResourceResponse();
fileDir: string = ""

loadData() {
try {
if (this.urlPath.includes("http") == false) {
this.loadLocalUrl()
} else {
this.controller.loadUrl(this.urlPath)
}

} catch (e) {
  showShortCenterToast("加载失败")
}

}

/// 第一步,替换本地资源路径
loadLocalUrl() {
let parts = this.urlPath.split('/');
// 如果数组长度大于 1,移除最后一个元素
if (parts.length > 1) {
parts.pop();
}
// 当前H5所在文件夹的绝对路径
this.fileDir = parts.join('/')

let html = fs.readTextSync(this.urlPath)
// 要插入的指定字符串
const insertString = "http://local";
// 定义正则表达式
const regex = /src="([^"]+\.(?:png|jpg|gif))"/gi;
// 执行替换操作
const imageHtml = html.replace(regex, (_, p1: string) => {
  let content = `src="${insertString}/${p1}"`;
  return content
});

// href定义正则表达式
const cssRegex = /href="([^"]+\.(?:css|html))"/gi;
const cssHtml = imageHtml.replace(cssRegex, (_, p1: string) => {
  let content = `href="${insertString}/${p1}"`;
  return content
});
this.controller.loadData(
  cssHtml,
  'text/html',
  'UTF-8'
);

}

build() {
Web({ src: this.urlPath, controller: this.controller })
.width(FULL_WIDTH)
.mixedMode(MixedMode.All)
.layoutWeight(1)
.onControllerAttached(() => {
this.loadData()
})
.onLoadIntercept((event) => {
let url = event.data.getRequestUrl()
// 跳转拦截
if (url.toLowerCase().startsWith('http://local') && url.toLowerCase().endsWith("html/")) {
url = url.replace("http://local", "")
url = url.toUpperCase()
url = url.replace("HTML/", "html")

      const filePath = this.fileDir + "/" + url
      if (fs.accessSync(filePath)) {
        this.urlPath = filePath
        this.loadLocalUrl()
        return true
      }
    }
    return false
  })
  .onInterceptRequest((event) => {

/// 第二步,拦截对应的资源,读取本地资源后并返回
let url = event.request.getRequestUrl()
// 本地资源加载拦截
if (url.startsWith('http://local')) {
const promise: Promise = new Promise((resolve: Function, reject: Function) => {
url = url.replace("http://local", "")
const filePath = this.fileDir + "/" + url
if (fs.accessSync(filePath)) {
if (url.toLowerCase().endsWith(".png") ||
url.toLowerCase().endsWith(".jpg") ||
url.toLowerCase().endsWith(".gif") ||
url.toLowerCase().endsWith(".css")) {

            const fd = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
            // 获取文件的大小
            const stat = fs.statSync(fd.fd);
            const fileSize = stat.size;
            // 创建一个指定大小的 ArrayBuffer
            const buffer = new ArrayBuffer(fileSize);
            // 读取文件内容到 ArrayBuffer
            fs.readSync(fd.fd, buffer);
            this.responseWeb.setResponseData(buffer);
            if (url.toLowerCase().endsWith(".css")) {
              this.responseWeb.setResponseMimeType('text/css');
            } else {
              this.responseWeb.setResponseMimeType('image/*');
            }
          }
          this.responseWeb.setResponseCode(200);
          this.responseWeb.setReasonMessage('OK');
          resolve("success");
        } else {
          reject("failed")
        }
      })
      promise.then(() => {
        this.responseWeb.setResponseIsReady(true);
      })
      this.responseWeb.setResponseIsReady(false);
      return this.responseWeb;
    }
    return null

  })
  .width(FULL_WIDTH)
  .height(FULL_HEIGHT)

}
}

相关文章
|
4月前
|
开发框架 监控 安全
Windows Defender 导致 Web IIS 服务异常停止排查
某日凌晨IIS服务异常停止,经查为Windows Defender安全补丁KB2267602触发引擎更新,导致系统资源波动,进而引发应用池回收。确认非人为操作,系统无重启。通过分析日志与监控,定位原因为Defender更新后扫描加重负载。解决方案:将IIS及.NET相关路径添加至Defender排除列表,避免业务影响。
560 116
|
8月前
|
JavaScript 开发工具 开发者
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
289 3
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
491 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
449 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
883 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
244 0
|
10月前
|
人工智能 搜索推荐 IDE
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
509 2
|
9月前
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
|
存储 JavaScript 关系型数据库
鸿蒙开发:实现全局异常捕获和异常查看
如何灵活的拿到错误信息后,执行我们想要的逻辑,也是自研的一个诉求,比如全局监听到异常后,重启应用,或者上传到自己的服务器,或者可以在应用内查看等等,实现一个全局异常捕获,确实有很多的有用之处。
335 3
鸿蒙开发:实现全局异常捕获和异常查看
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
420 7