Ionic 5 Native File插件无法向dataDirectory写入文件如何解决
问题解决步骤
1. 先排查父文件夹是否存在
Ionic File插件的writeFile方法不会自动创建不存在的父级文件夹,当目标文件夹不存在时会出现静默写入失败无报错的情况,需要先调用文件夹创建/校验逻辑:
// 先校验文件夹是否存在,不存在则创建 file.checkDir(file.dataDirectory, folderName) .then(() => doWrite()) .catch(() => { return file.createDir(file.dataDirectory, folderName, false) .then(() => doWrite()) }) // 写入逻辑 function doWrite() { // 注意父目录路径末尾要补斜杠,避免插件路径解析错误 const targetDir = `${file.dataDirectory}${folderName}/` return file.writeFile(targetDir, fileName, data, { replace: true }) .then(() => { // 写入后主动读取验证写入结果,避免找错路径 return file.readAsText(targetDir, fileName) }) .then(content => console.log('写入验证成功,文件内容:', content)) .catch(err => console.error('写入失败:', err)) }
2. 排查路径查看错误
file.dataDirectory对应的是Android应用内部私有目录,路径为/data/data/[你的应用包名]/files/,未root的设备无法通过系统文件管理器直接访问,你之前查看的Android/my.app.id/files/是外部私有目录,对应file.externalDataDirectory。如果需要在文件管理器中直接查看写入的文件,将写入根目录替换为file.externalDataDirectory即可。
3. 修正不必要的配置
你之前添加的allow-navigation相关配置和文件写入权限无关,无需保留,反而会带来安全风险。如果是Android 10及以上系统,需要在config.xml的Android平台配置中补充分区存储适配参数:
<platform name="android"> <preference name="AndroidPersistentFileLocation" value="Compatibility" /> <preference name="android-requestLegacyExternalStorage" value="true" /> <!-- 访问外部存储时添加权限,Android13以上无需申请WRITE_EXTERNAL_STORAGE --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> </platform>
4. 解决ENCODING_ERR报错
该错误通常由两个原因导致:
- 写入路径包含特殊字符、中文未转义,或者路径格式不符合插件要求,不要手动拼接多层复杂路径,优先用插件内置的
resolveLocalFilesystemUrl方法解析路径 - 写入的data格式和编码不匹配,比如写入二进制Blob时未指定正确的mime类型,或者传入了不可序列化的对象类型
内容的提问来源于stack exchange,提问作者ELSTADT
相关产品推荐
相关产品推荐

