uni-app uni.previewImage方法预览本地图片时,更新完不一样的图片内容但图片名称相同,预览图片未更新内容
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 | 云端 |
直接去 手机文件管理器 查看这张照片,一样不一样
上传可以复现的demo,方便排查
直接打开文件本身时,是图片B
从文件管理里打开对应图片是图片B
解决了吗
直接IO读文件,预览base64格式的
在处理 uni-app
中的 uni.previewImage
方法预览本地图片时,如果更新了图片内容但文件名相同,预览图片未更新内容的问题,通常是由于缓存或者路径解析不正确导致的。以下是一个可能的解决方案,通过动态生成唯一的文件名来确保每次预览的都是最新的图片内容。
解决方案概述
- 生成唯一文件名:在每次保存图片时,根据时间戳或其他唯一标识符生成一个新的文件名。
- 更新图片路径:在更新图片后,确保
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
进行预览。
这种方法确保了每次预览的都是最新的图片内容,即使文件名相同,由于路径的唯一性,也不会出现预览内容未更新的问题。