当展示列表使用 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.视频就可以播放了加载了

相关推荐
云烟成雨TD20 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
于慨20 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz20 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
swg32132120 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
从前慢丶20 小时前
前端交互规范(Web 端)
前端
像我这样帅的人丶你还20 小时前
别再让JS耽误你进步了。
css·vue.js
gelald20 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
@yanyu66620 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
殷紫川20 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月20 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得