uni-app 视频和图片压缩API(compressVideo,compressImage)返回含中文的临时路径时,plus.io调取路径报错

uni-app 视频和图片压缩API(compressVideo,compressImage)返回含中文的临时路径时,plus.io调取路径报错

开发环境 版本号 项目创建方式
Windows 10 HBuilderX

示例代码:

实例如下:

  • compressImage() 返回原始文件名路径,如 _doc/.../中文.jpg
  • compressVideo() 返回 encodeURI 后的文件路径,如: file:///storage/.../%E4%B8%AD%E6%96%87.mp4

### 操作步骤:


```javascript
uni.compressVideo({  
    src: path,  
    bitrate: bitrate,  
    fps: fps,  
    resolution: resolution,  
    success: (res) => {  
        plus.io.resolveLocalFileSystemURL(res.tempFilePath,(fileEntry)=>{});  
    }  
})

### 预期结果:


plus.io.resolveLocalFileSystemURL可以正常解析路径

实际结果:

plus.io.resolveLocalFileSystemURL未能解析路径,报错“路径不存在”


### bug描述:


压缩包含中文路径的图片和视频时存在如下两个不统一:

1. 格式不同,image返回本地URL路径,video返回`file://`的绝对路径
2. 路径编码不同,image返回未经过编码的路径,video返回经过`encodeURI`的路径

如上问题,就会导致 `compressVideo`时返回的 `encodeURI` 的路径,再使用plus 的 `resolveLocalFileSystemURL` 方法报错 `路径不存在`

更多关于uni-app 视频和图片压缩API(compressVideo,compressImage)返回含中文的临时路径时,plus.io调取路径报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

decodeURIComponent 试试看

更多关于uni-app 视频和图片压缩API(compressVideo,compressImage)返回含中文的临时路径时,plus.io调取路径报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


是的compressVideo需要decode,但是compressImage就不用。我觉得这两个类似的API应该格式统一。

你压缩成功之后,去手机的 文件存储 里看这个文件存不存在

存在,看截图需要把带中文的路径,decodeURI后才能使用plus.io.resolveLocalFileSystemURL(decodeURI(res.temFilePath));

回复 IT小哥: 我理解错了,以后你decodeURI之后,不能使用呢

这是一个典型的路径编码处理问题。根据你的描述,问题核心在于compressVideocompressImage两个API返回的临时路径格式和编码方式不一致。

问题分析:

  1. compressImage返回的是相对路径(如_doc/.../中文.jpg),这种路径可以直接被plus.io相关方法识别
  2. compressVideo返回的是经过encodeURI编码的绝对路径(如file:///storage/.../%E4%B8%AD%E6%96%87.mp4),这种编码后的路径在某些情况下可能无法被正确解析

解决方案:

对于compressVideo返回的路径,在使用plus.io.resolveLocalFileSystemURL之前,需要先对路径进行解码处理:

uni.compressVideo({  
    src: path,  
    bitrate: bitrate,  
    fps: fps,  
    resolution: resolution,  
    success: (res) => {  
        // 对返回的路径进行解码
        const decodedPath = decodeURI(res.tempFilePath);
        plus.io.resolveLocalFileSystemURL(decodedPath, (fileEntry) => {
            // 处理成功回调
        }, (error) => {
            console.error('解析文件失败:', error);
        });  
    },
    fail: (error) => {
        console.error('压缩视频失败:', error);
    }
});

补充建议:

为了统一处理,建议对所有可能包含中文的路径都进行解码处理:

function resolveFilePath(filePath) {
    // 统一解码处理
    return decodeURI(filePath);
}

// 使用时
const decodedPath = resolveFilePath(res.tempFilePath);
plus.io.resolveLocalFileSystemURL(decodedPath, callback);
回到顶部