uni-app uni.previewImage方法预览本地图片时,更新完不一样的图片内容但图片名称相同,预览图片未更新内容

发布于 1周前 作者 vueper 来自 Uni-App

uni-app uni.previewImage方法预览本地图片时,更新完不一样的图片内容但图片名称相同,预览图片未更新内容

操作步骤

let _url = ‘/storage/emulated/0/Android/data/io.dcloud.HBuilder/downloads/headPortrait/311249ce-6444-4303-99ba-32c64f3c4df7?ran=1684132575644’; // 图片A
uni.previewImage({urls: [img], current: img}); // 预览图片A

更新完当前图片后,路径不变,但是内容变为图片B

let _url = ‘/storage/emulated/0/Android/data/io.dcloud.HBuilder/downloads/headPortrait/311249ce-6444-4303-99ba-32c64f3c4df7?ran=1684132575994’; // 图片B
uni.previewImage({urls: [img], current: img}); // 结果:预览内容还是图片A

预期结果

更新完后,预览内容为图片B

实际结果

预览内容还是图片A

bug描述

uni.previewImage方法预览本地图片,同样的图片路径,但是预览内容未即时更新

开发环境与版本信息

项目创建方式 PC开发环境操作系统 PC开发环境操作系统版本号 HBuilderX类型 HBuilderX版本号 手机系统 手机系统版本号 手机厂商 手机机型 页面类型 vue版本 打包方式
HBuilderX Windows win11 正式 3.7.11 Android Android 12 华为 HarmonyOS 2.0.0 vue vue2 云端

8 回复

直接去 手机文件管理器 查看这张照片,一样不一样
上传可以复现的demo,方便排查


直接打开文件本身时,是图片B

let _url = ‘/storage/emulated/0/Android/data/io.dcloud.HBuilder/downloads/headPortrait/311249ce-6444-4303-99ba-32c64f3c4df7’;//图片A uni.previewImage({urls: [img],current: img});//此时预览结果是图片A uni.removeSavedFile({ filePath:_url , complete: function() { let dtask = plus.downloader.createDownload(httpUrl, { filename: ‘_downloads/headPortrait/311249ce-6444-4303-99ba-32c64f3c4df7’ }, function(d, status) { //d为文件下载对象 if (status == 200) { let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename) uni.previewImage({urls: [d.filename],current: d.filename});//结果预览图片A,期望预览图片B } else { fc.consoleLog(“下载失败---------------------------->”) } }) dtask.start(); //执行下载 });

从文件管理里打开对应图片是图片B

直接IO读文件,预览base64格式的

在使用 uni.previewImage 方法预览本地图片时,如果更新了图片内容但文件名相同,可能会遇到图片内容未更新的问题。这是因为浏览器或应用可能会缓存图片,导致即使图片内容已更新,预览时仍显示旧的内容 。
为了解决这个问题,可以尝试以下几种方法:
添加随机参数:在图片路径后添加一个随机参数,以防止缓存。例如:
javascript
let url = ‘/path/to/your/image.jpg’;
let timestamp = new Date().getTime();
uni.previewImage({
urls: [${url}?t=${timestamp}],
current: ${url}?t=${timestamp}
}); 这种方法通过在图片路径后添加一个时间戳或其他随机参数,使得每次请求的 URL 都是唯一的,从而避免缓存 。 这是ai给的解决方案,可以解决这个问题

在处理 uni-app 中的 uni.previewImage 方法预览本地图片时,如果更新了图片内容但文件名相同,预览图片未更新内容的问题,通常是由于缓存或者路径解析不正确导致的。以下是一个可能的解决方案,通过动态生成唯一的文件名来确保每次预览的都是最新的图片内容。

解决方案概述

  1. 生成唯一文件名:在每次保存图片时,根据时间戳或其他唯一标识符生成一个新的文件名。
  2. 更新图片路径:在更新图片后,确保 uni.previewImage 使用的是更新后的图片路径。

代码示例

假设你有一个页面,用户可以上传或更新图片,并使用 uni.previewImage 预览图片。

// pages/index/index.vue
<template>
  <view>
    <button @click="chooseImage">选择图片</button>
    <button @click="previewImage">预览图片</button>
    <image :src="imagePath" mode="widthFix" v-if="imagePath"></image>
  </view>
</template>

<script>
export default {
  data() {
    return {
      imagePath: ''
    };
  },
  methods: {
    chooseImage() {
      uni.chooseImage({
        count: 1,
        success: (res) => {
          const filePath = res.tempFilePaths[0];
          const uniqueName = `image_${Date.now()}.jpg`; // 生成唯一文件名
          
          // 假设你有一个函数 uploadImage 将图片上传到服务器或保存到本地
          this.uploadImage(filePath, uniqueName).then(savedPath => {
            this.imagePath = savedPath; // 更新图片路径为保存后的路径
          });
        }
      });
    },
    previewImage() {
      if (this.imagePath) {
        uni.previewImage({
          current: this.imagePath, // 当前显示图片的http链接
          urls: [this.imagePath] // 需要预览的图片http链接列表
        });
      }
    },
    uploadImage(filePath, fileName) {
      // 这里可以是你将图片上传到服务器或保存到本地的逻辑
      // 返回一个Promise,解析为保存后的图片路径
      return new Promise((resolve) => {
        // 模拟保存图片
        setTimeout(() => {
          resolve(`/static/${fileName}`); // 假设保存后的路径
        }, 1000);
      });
    }
  }
};
</script>

说明

  • 生成唯一文件名:在 chooseImage 方法中,使用 Date.now() 生成一个基于当前时间戳的唯一文件名。
  • 更新图片路径:在图片上传或保存成功后,更新 imagePath 为新的图片路径。
  • 预览图片:在 previewImage 方法中,使用更新后的 imagePath 进行预览。

这种方法确保了每次预览的都是最新的图片内容,即使文件名相同,由于路径的唯一性,也不会出现预览内容未更新的问题。

回到顶部