uni.chooseMedia返回的tempFilePath出现两种前缀,是平台文件系统差异 + 是否走压缩路径导致的正常现象:
/storage/emulated/...出现场景:
Android 10 以下,或
Android 10+ 但用户选择了“原图/原视频”(HBuilderX 3.6+ 默认把原文件拷贝到应用私有缓存目录)
本质:文件已真实落在沙箱缓存目录,后续可直接
uni.uploadFile或plus.io.*读取。
content://media/external/...出现场景:
Android 10+ 且用户勾选了“压缩”(或选了相册里“最近”项),框架为了节省拷贝耗时,直接返回MediaStore 的 contentUri。
特点:
没有物理路径,只能使用
plus.io.convertLocalFileSystemURL或uni.uploadFile透传上传;若用
plus.io.resolveLocalFileSystemURL会报NOT_FOUND_ERR,因为文件并未复制到本地。
iOS 始终返回
file://...沙箱路径,不存在 contentUri。
开发建议(一条代码兼容)
uni.chooseMedia({ count:1, success(res){ let path = res.tempFiles[0].tempFilePath; // Android content:// 先转成本地可上传地址 if(path.startsWith('content://')){ path = plus.io.convertLocalFileSystemURL(path); } uni.uploadFile({url:'...',filePath:path}); } });