z***@126.com
z***@126.com
  • 发布:2018-11-05 11:20
  • 更新:2022-08-25 16:42
  • 阅读:6201

【报Bug】uniapp图片缓存到本地后,ios模拟器上可以显示,真机不显示。

分类:uni-app

详细问题描述(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)
[内容]

重现步骤
[步骤]
图片缓存到本地,安卓可以正常显示图片,苹果手机不可以

11:04:50.907 [LOG] : 下载回调status==200-->_downloads/image/1d5af143547469836fb5fe15f6e18e72.jpg
11:04:50.931 [LOG] : file:///Users/zhengwanjun/Library/Developer/CoreSimulator/Devices/5ADC18F7-6278-47CB-8040-9FB7F8E52B5D/data/Containers/Data/Application/F4896374-AA57-4ADD-814A-522E1620AE18/Library/Caches/Pandora/downloads/image/1d5af143547469836fb5fe15f6e18e72.jpg
这个是我现在的路径和模拟器中图片存储位置

代码部分

           // 显示的图片  
             <image class="cache-img" :mode="mode" :src="absolutePath" />  
           // 确认是否已经缓存  
         <image :src="url" @load="_imgOnLoad" @error="_imgOnLoadError" style="width: 0; height: 0; opacity: 0;" />  

//  下载的位置  
let hbPath = `${constant.cachePath}image/${hex_md5(this.uniqueStr)}.jpg`; //HBuilder平台路径  
let sdPath = 'file://' + plus.io.convertLocalFileSystemURL(hbPath); //SD卡绝对路径  
                             //  tastArr中放入下载任务  
                              let obj = {  
                    imageUrl: this.src,  
                    hbPath: this.hbPath,  
                    sdPath: this.sdPath  
                }  
                               //  下载成功后 回调  
                this.imgCache.pushTask(obj, this.setImageUrl)  

//  下载代码  
downloadTask = downloadTask || plus.downloader.createDownload(imageUrl, {  
            "filename": hbPath,  
            "timeout": 10,  
            "retry": 2  
        }, function(download, status) {  
            console.log("下载回调status==" + status+"-->"+hbPath);  
            if (status == 200) {  
                cb(sdPath, obj);  
            }else{  
                delFile(hbPath);  
                download.abort();  
            }  
            //继续下载  
            that.startTask(cb);  
        });  
        downloadTask.start();  
}  
                 //  将下载好的图片赋值给图片  
                    setImageUrl(sdPath, obj) {  
                if (sdPath === this.sdPath) {  
                    console.log(sdPath)  
                    this.absolutePath = obj.hbPath   
                }  
            }  

[结果]
[期望] 希望苹果手机也显示正常

IDE运行环境说明
[HBuilder 或 HBuilderX] HBuilderX最新版本

App运行环境说明
[iOS版本号] iphone 7p 11.4.1

附件
[IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传]
[App问题请提供可重现问题的代码片段,你补充的细一点,问题就解决的快一点]
[安装包]

联系方式
[QQ]232581115

2018-11-05 11:20 负责人:无 分享
已邀请:
Trust

Trust - 少说废话

模拟器和真机是存在差异的,尤其是文件目录这一部分。

主动加 file: 头这种操作,肯定是不推荐的。建议调整为 uni 的 API 或者直接用返回的地址赋值,不要随意拼接转换路径信息。

另外,为什么要用 5+ 的 API,uni 的不能满足需求么。

  • z***@126.com (作者)

    倒不是别的,就是看别人的帖子都是用的5+的API,而且uni.download没法指定文件名称,就用了5+的api

    2018-11-06 14:37

  • 灰色的灵魂

    回复 z***@126.com: 你好,请问您的uniapp图片离线问题解决了吗?

    我也需要能实现全站的离线图片下载替换。求解决方法

    qq:27888677

    2019-04-24 11:34

  • 1***@qq.com

    回复 z***@126.com: 你好,请问能否分享 uni-app 图片离线的解决方案呢?

    2019-05-01 16:54

  • gsgundam

    测试中发现uni的api确实不能满足要求,比如使用saveFile存储了文件,但是如果在文件管理器里直接删除了对应的文件,还是能获取到文件信息,没法判断图片是否真的存在

    2019-05-15 11:39

唉呀妈呀

唉呀妈呀 - 开朗

你好,请问这个问题解决了吗

1***@qq.com

1***@qq.com - 80码农

我也遇到了,H5+ 缓存图片 ios不显示,hbuiderx 2.2版本可以,2.4.6不可以;不知道什么原因

sharper

sharper - 坐看风云涌起

见证dcloud的成长,官方已经做的不错了。
大家试试这个:https://ext.dcloud.net.cn/plugin?id=1605

尼卡路西

尼卡路西

坑真多,是大家都已经解决了,还是已经放弃图片缓存了?虽然时间过去了这么久,经过了一番折腾后,也算是解决了:

plus.io.resolveLocalFileSystemURL(  
                    this.local_src,  
                    entry => {  
                        entry.file(file => {  
                            var fileReader = new plus.io.FileReader();  
                            fileReader.readAsDataURL(file, 'utf-8');  
                            fileReader.onloadend = evt => {  
                                this.src = evt.target.result.replace(/[\r\n]/g, '');  
                            };  
                        });  
                    },  
                    function(e) {  
                        console.log('Resolve file URL failed: ' + e.message);  
                    }  
                );

把文件读取出来,转 base64 码就可以正常显示了,安卓和ios都能正常显示

  • 尼卡路西

    以上方案有问题,大图转 base64 之后,数据会有问题,导致图片显示有问题。后面找到了完美解决方案,有时间封装成插件,上传到插件市场。

    2022-08-26 10:03

  • 2***@qq.com

    回复 1***@qq.com: 大佬怎么解决的,我转成base64在安卓模拟器上能正常显示图片,在真机上显示不了

    2022-10-21 17:03

  • imshiro

    回复 1***@qq.com: 你好,方便说一下你的完美解决方案吗?

    2023-02-16 11:11

  • 2***@qq.com

    回复 尼卡路西: https://ask.dcloud.net.cn/question/177970

    2023-09-10 10:47

  • s***@qq.com

    兄弟,完美解决方案能分享一下吗?

    2023-11-27 18:24

该问题目前已经被锁定, 无法添加新回复