Ionic Cordova中FilePath.resolveNativePath报错:无法解析文件系统路径(Android端PDF上传场景)
我来帮你搞定这个URI解析报错的问题!你遇到的Unable to resolve filesystem path错误,本质是因为Android 10+的分区存储机制,以及cordova-plugin-filepath对媒体库生成的content://类型URI的兼容性问题——这类URI是媒体库的虚拟访问路径,并非真实的文件系统路径,所以resolveNativePath方法无法正确解析。
下面给你两种可行的解决方案,结合你的代码修改:
方案1:直接使用Content URI上传(最简单)
新版的cordova-plugin-file-transfer已经支持直接传入content://类型的URI,不需要转成真实路径。你可以直接把Chooser返回的file.uri传给上传方法试试:
choosePDFFiles() { this.chooser.getFile("application/PDF") .then(async (file) => { try { // 直接使用content URI上传,无需转路径 const uploadResult = await this.fileTransferService.upload( encodeURI(file.uri), 'profileCertifications', 'application/pdf' ); const x = JSON.parse(uploadResult.response); console.log(x); } catch (err) { console.log('上传或解析错误:', err); } }) .catch(chooserErr => { console.log('选择文件失败:', chooserErr); }); }
如果上传时出现权限或路径问题,可以给upload方法添加额外参数,比如关闭分块传输:
const options = { chunkedMode: false, headers: { // 按需添加请求头,比如认证信息 } }; const uploadResult = await this.fileTransferService.upload(encodeURI(file.uri), 'profileCertifications', options);
方案2:用cordova-plugin-file解析URI(更可靠)
如果方案1不行,就用cordova-plugin-file来处理content:// URI,它能通过Android的ContentResolver正确访问文件,而不是依赖真实文件路径:
首先确保你已经导入了File插件:
import { File } from '@awesome-cordova-plugins/file/ngx';
然后修改你的方法:
choosePDFFiles() { this.chooser.getFile("application/PDF") .then(async (file) => { this.file.resolveLocalFileSystemURL(file.uri) .then(async (fileEntry) => { // 获取文件的Native URL,这个路径file-transfer可以直接识别 const nativeFilePath = fileEntry.nativeURL; try { const uploadResult = await this.fileTransferService.upload( encodeURI(nativeFilePath), 'profileCertifications', 'application/pdf' ); const x = JSON.parse(uploadResult.response); console.log(x); } catch (uploadErr) { console.log('上传失败:', uploadErr); } }) .catch(resolveErr => { console.log('解析URI失败:', resolveErr); }); }) .catch(chooserErr => { console.log('选择文件失败:', chooserErr); }); }
为什么原来的方法不行?
Android 10开始启用了分区存储,应用无法直接访问外部存储的真实文件路径,只能通过媒体库的content:// URI或SAF(存储访问框架)来访问文件。cordova-plugin-filepath的resolveNativePath方法在这种环境下,对媒体库生成的URI支持不佳,所以会抛出解析失败的错误。
而cordova-plugin-file的resolveLocalFileSystemURL方法是通过Android官方的Content API来处理URI,能绕过分区存储的限制,正确获取文件的访问入口。
内容的提问来源于stack exchange,提问作者Sai Kiran

