uni-app uni.chooseImage 会持久保存图片,不是临时缓存。

uni-app uni.chooseImage 会持久保存图片,不是临时缓存。

开发环境 版本号 项目创建方式
Windows win11 HBuilderX
### 操作步骤:
- uni.chooseImage 选择图片,并使用uni.uploadFile上传

### 预期结果:
- uni.chooseImage 选择图片,并使用uni.uploadFile上传,应该清除掉临时缓存的图片

### 实际结果:
- uni.chooseImage 选择图片,并使用uni.uploadFile上传,缓存会持久保存到手机,重启应用也还在。

### bug描述:
选择图片后会保存在app的数据里files/DCIM,
应该自动清理掉这些图片吧。
我们的业务拍照多,那岂不是会存很大?
没有调用
uni.chooseImage({  
    count: 1,  
    sizeType: ['original', 'compressed'],  
    sourceType: ['camera'],  
})

更多关于uni-app uni.chooseImage 会持久保存图片,不是临时缓存。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

您现在这个问题解决了吗?我也遇到了这个问题,频繁调用app,会导致文稿数据越来越大,没办法清除缓存,应用特别卡

更多关于uni-app uni.chooseImage 会持久保存图片,不是临时缓存。的实战教程也可以访问 https://www.itying.com/category-93-b0.html


频繁调用摄像头拍照,导致用户数据越来越多,重启应用也没有作用!

这个帖子上面说是解决了,你一直复现么,请把demo发一下可以么

回复 小枫叶: 我这边测试的是没有存储,不知道你是只有这个手机是这样,还是所有的手机都是这样呢

这个问题解决了么 同样遇到files/DCIM下图片增多问题

https://blog.csdn.net/qq_34685515/article/details/120074484。 可以看看这个文档,但是要区分正式环境和基座环境的图片路径。

根据你的描述,这确实是 uni-app 中 uni.chooseImage 方法在部分平台(尤其是App端)的一个已知行为。它并非严格意义上的“临时缓存”,而是将选择的图片文件持久化保存到了应用的私有目录中。

核心原因: uni.chooseImage 方法在调用时,尤其是在App端,系统或框架需要将图片(无论是从相册选择还是相机拍摄)生成一个可供JavaScript安全访问的本地文件路径(如 file:// 开头)。这个过程通常涉及将图片复制到应用的沙盒目录(如 uniapp_tempfiles/DCIM 等子目录)。这个文件默认不会在上传后自动删除。

你的理解是正确的: 如果业务中频繁拍照或选择图片,这些文件会持续累积,占用用户的存储空间。框架本身没有提供自动清理的机制,需要开发者手动处理。

解决方案: 你需要在 uni.uploadFile 上传成功(或确定不再需要该文件后)的回调中,手动删除chooseImage 生成的临时文件。

修改后的代码示例:

uni.chooseImage({
    count: 1,
    sizeType: ['original', 'compressed'],
    sourceType: ['camera'],
    success: (res) => {
        const tempFilePaths = res.tempFilePaths; // 这是一个数组,即使一张图
        const tempFilePath = tempFilePaths[0];

        // 执行上传
        uni.uploadFile({
            url: '你的服务器地址',
            filePath: tempFilePath,
            name: 'file',
            success: (uploadRes) => {
                console.log('上传成功', uploadRes.data);

                // !!!关键步骤:上传成功后,删除本地临时文件
                // #ifdef APP-PLUS
                plus.io.resolveLocalFileSystemURL(tempFilePath, (entry) => {
                    entry.remove(() => {
                        console.log('临时文件已删除');
                    }, (removeError) => {
                        console.error('删除临时文件失败:', removeError);
                    });
                }, (resolveError) => {
                    console.error('解析文件路径失败:', resolveError);
                });
                // #endif

                // 对于H5等平台,可以尝试使用URL.revokeObjectURL,但通常不需要处理物理文件。
            },
            fail: (uploadErr) => {
                console.error('上传失败', uploadErr);
                // 上传失败时,根据业务决定是否删除。例如,可以提示用户后删除。
            }
        });
    }
});
回到顶部