当展示列表使用 URL.createObjectURL 的创建临时图片、视频无法加载问题

问题总结:因缓存机制问题,及更新同异步造成视频未及时更新

1.图片使用

复制代码
<a-image

                

                :width="40"

                :height="40"

                :src="

requestUrl(record.imagePreSignedUrl) "

              />

2.创建响应式方法

复制代码
//图片缓存管理
const imageCache = ref(new Map<string, string>());
// 新增:获取图片URL的响应式方法
const getImageUrl = (url: string): string => {
  if (!url || !isProductionHaishi.value) {
    return url || "";
  }

  // 检查缓存
  if (imageCache.value.has(url)) {
    return imageCache.value.get(url)!;
  }

  // 异步加载图片
  loadImageToBase64(url);
  return "";
};

3.通过请求转换图片

复制代码
// 新增:异步加载图片并转换为base64
const loadImageToBase64 = async (url: string) => {
  if (!url || imageCache.value.has(url)) {
    return;
  }

  try {
    const token = Util.getAuthorization();//自己获取本地token方法
    const response = await axios({
      method: "GET",
      url: url,
      responseType: "blob",
      headers: {
        Authorization: `Bearer ${token}`,
      },
    });

    const blob = response.data;
    const base64Data = await blobToDataURL(blob);

    // 更新缓存
    imageCache.value.set(url, base64Data);

    // 触发视图更新
    imageCache.value = new Map(imageCache.value);
  } catch (error) {
    console.error("图片加载失败:", error);
    // 可以设置一个错误占位图
    imageCache.value.set(url, "");
    imageCache.value = new Map(imageCache.value);
  }
};

4.图片就可以正常加载了;

-----------------------------------------------------分割线----------------------------------------------------------

问题:视频播放问题

1.引用

复制代码
 <video
           
            ref="videoPlayerRef"
            width="1150"
            height="auto"
            controls
          >
            <source
              :src=" getVideoUrl(previewVideo) "
              type="video/mp4"
            />
          </video>

2.新增:获取视频URL的响应式方法

复制代码
// 新增:视频缓存管理
const videoCache = ref(new Map<string, string>());
const getVideoUrl = (url: string): string => {
  if (!url || !isProductionHaishi.value) {
    return url || "";
  }

  // 检查缓存
  if (videoCache.value.has(url)) {
    return videoCache.value.get(url)!;
  }

  // 异步加载视频
  loadVideoToBase64(url);
  return "";
};

3.新增:异步加载视频并转换为base64

复制代码
const loadVideoToBase64 = async (url: string) => {
  if (!url || videoCache.value.has(url)) {
    return;
  }

  try {
    const token = Util.getAuthorization();//根据自己获取token方法修改
    const response = await axios({
      method: "GET",
      url: url,
      responseType: "blob",
      headers: {
        Authorization: `Bearer ${token}`,
      },
    });

    const blob = response.data;
    const base64Data = await blobToDataURL(blob);

    // 更新缓存
    videoCache.value.set(url, base64Data);

    // 触发视图更新
    videoCache.value = new Map(videoCache.value);
  } catch (error) {
    console.error("视频加载失败:", error);
    // 可以设置一个错误占位视频或空字符串
    videoCache.value.set(url, "");
    videoCache.value = new Map(videoCache.value);
  }
};

4.视频就可以播放了加载了

相关推荐
wand codemonkey9 分钟前
SpringbootWeb【入门】+MySQL【安装】+【DataDrip安装 】+【连接MySQL】
java·mysql·mybatis
Highcharts.js1 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
LaughingZhu8 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫8 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
Mahir088 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
小鹏linux9 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
RyFit9 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码9 小时前
C++ 内存分区 堆区
java·开发语言·c++
前端若水10 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
绝知此事10 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表