uni-app uni.chooseImage 在ios选择了相册获得地址临时地址,在plus.io.requestFileSystem要转base64中,报错提示:文件没有发现

uni-app uni.chooseImage 在ios选择了相册获得地址临时地址,在plus.io.requestFileSystem要转base64中,报错提示:文件没有发现

开发环境 版本号 项目创建方式
Windows win10 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:4.85

手机系统:iOS

手机系统版本号:iOS 17

手机厂商:苹果

手机机型:平板X8 Pro

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

### 示例代码:

```javascript
uni.chooseImage({  
    count: 1,  
    sizeType: ['compressed'],  
    crop:{  
        width:800,  
        height:800,  
    },  
    success: function (res) {  
        var addr = res.tempFilePaths[0];  
        plus.io.requestFileSystem(  
            plus.io.PUBLIC_DOCUMENTS,  
            fs => {  
                fs.root.getFile(  
                    addr,  
                    {  
                        create: false  
                    },  
                    fileEntry => {  
                        fileEntry.file(function(file) {  
                            var reader = new plus.io.FileReader();  
                            reader.onloadend = function(e) {  
                                var base64Data = e.target.result;  
                                console.log(base64Data);  
                            };  
                            reader.readAsDataURL(file);  
                        })  
                    },  
                    e => {  
                        console.log('转换 出错',e)  
                        console.log(false)  
                    }  
                )  
            },  
            e => {  
                console.log(e.message)  
                console.log(false)  
            }  
        )  
    }  
});

操作步骤:

uni.chooseImage({  
    count: 1,  
    sizeType: ['compressed'],  
    crop:{  
        width:800,  
        height:800,  
    },  
    success: function (res) {  
        var addr = res.tempFilePaths[0];  
        plus.io.requestFileSystem(  
            plus.io.PUBLIC_DOCUMENTS,  
            fs => {  
                fs.root.getFile(  
                    addr,  
                    {  
                        create: false  
                    },  
                    fileEntry => {  
                        fileEntry.file(function(file) {  
                            var reader = new plus.io.FileReader();  
                            reader.onloadend = function(e) {  
                                var base64Data = e.target.result;  
                                console.log(base64Data);  
                            };  
                            reader.readAsDataURL(file);  
                        })  
                    },  
                    e => {  
                        console.log('转换 出错',e)  
                        console.log(false)  
                    }  
                )  
            },  
            e => {  
                console.log(e.message)  
                console.log(false)  
            }  
        )  
    }  
});

预期结果:

出现base64的编码

实际结果:

转换 出错, [Object] {“code”:1,“message”:“文件没有发现”}

bug描述:

【报Bug】uni.chooseImage 在ios短选择了相册后进行裁剪获得的res.tempFilePaths[0]地址传输给plus.io.requestFileSystem中,报错提示:文件没有发现


更多关于uni-app uni.chooseImage 在ios选择了相册获得地址临时地址,在plus.io.requestFileSystem要转base64中,报错提示:文件没有发现的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你试下下面这样写看看 let convertLocalFileSystemURL = plus.io.convertLocalFileSystemURL(addr);
let fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(convertLocalFileSystemURL);
fileReader.onloadend = (onloadendRes) => {
console.log(onloadendRes);
// base64字段:onloadendRes.target.result
}

更多关于uni-app uni.chooseImage 在ios选择了相册获得地址临时地址,在plus.io.requestFileSystem要转base64中,报错提示:文件没有发现的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是因为iOS系统中uni.chooseImage返回的临时文件路径与plus.io.requestFileSystem访问的文件系统路径不匹配导致的。iOS的临时文件路径通常是应用沙箱内的临时目录,而plus.io.PUBLIC_DOCUMENTS指向的是公共文档目录,两者不在同一位置。

推荐使用以下两种方案解决:

方案一:使用uni-app官方API直接转换

uni.chooseImage({
    count: 1,
    sizeType: ['compressed'],
    crop: {
        width: 800,
        height: 800,
    },
    success: function (res) {
        const tempFilePath = res.tempFilePaths[0];
        // 使用uni.getFileSystemManager读取文件
        const fs = uni.getFileSystemManager();
        fs.readFile({
            filePath: tempFilePath,
            encoding: 'base64',
            success: (res) => {
                const base64Data = 'data:image/jpeg;base64,' + res.data;
                console.log(base64Data);
            },
            fail: (err) => {
                console.log('读取文件失败', err);
            }
        });
    }
});

方案二:使用plus.io.convertLocalFileSystemURL转换路径

uni.chooseImage({
    count: 1,
    sizeType: ['compressed'],
    crop: {
        width: 800,
        height: 800,
    },
    success: function (res) {
        const localPath = plus.io.convertLocalFileSystemURL(res.tempFilePaths[0]);
        plus.io.resolveLocalFileSystemURL(localPath, (entry) => {
            entry.file((file) => {
                const reader = new plus.io.FileReader();
                reader.onloadend = function(e) {
                    const base64Data = e.target.result;
                    console.log(base64Data);
                };
                reader.readAsDataURL(file);
            });
        }, (e) => {
            console.log('文件读取失败', e);
        });
    }
});
回到顶部