React Native Expo无法加载本地文件 readAsStringAsync无响应
问题现象
开发本地文件存储类移动端应用时,iOS端Expo Go环境下出现本地文件读取异常:
- 执行文件存在校验逻辑时,接口返回文件存在:
var info = await FileSystem.getInfoAsync(`${AppConstants.APP_FOLDER}/main.png`); console.log(info.exists); // 控制台输出true
- 后续执行文件读取逻辑时程序直接卡住,无任何控制台输出:
var content = await FileSystem.readAsStringAsync(`${AppConstants.TILE_FOLDER}/main.png`); console.log(content.length); // 无任何输出
- 测试使用的本地文件路径格式为
file:///var/mobile/Containers/Data/Application/.../app_folder/main.png,当前在线URL图片加载展示功能正常,仅本地文件读取触发异常。
解决步骤
按优先级依次排查修复:
- 先核对路径常量:你做存在检查用的路径拼接常量是
APP_FOLDER,读取文件用的是TILE_FOLDER,先在两行代码前分别打印拼接后的完整路径,确认两个路径完全指向同一个文件。部分旧版本Expo FileSystem在读取不存在/无权限路径时不会抛出异常,会直接挂起Promise,表现就是程序卡住无输出。 - 修正文件读取编码参数:
readAsStringAsync默认以UTF-8文本编码读取文件,你要读的是PNG格式的二进制图片,直接用默认参数读取时,iOS端会尝试把二进制字节按UTF-8解码,遇到非法编码字节时会出现解码阻塞、进程挂起。如果确实需要读取图片内容,必须指定编码为Base64:
如果你的需求只是在页面上展示这张本地图片,不需要调用读取接口,直接把本地文件路径传入Image组件的source属性即可渲染。var content = await FileSystem.readAsStringAsync( // 注意这里替换为你实际存储文件的正确路径 `${AppConstants.APP_FOLDER}/main.png`, { encoding: FileSystem.EncodingType.Base64 } ); console.log(content.length); - 检查权限配置:核对项目app.json里的iOS权限配置,确保配置了文件读权限对应的描述字段
NSDocumentsFolderUsageDescription,没有配置读权限时,部分版本Expo Go不会抛出权限异常,会直接挂起读取请求。 - 排除环境兼容问题:部分旧版本Expo Go内置的FileSystem模块存在iOS端读取二进制文件挂起的已知bug,可以升级Expo SDK到最新稳定版,或打development build测试,排除Expo Go内置环境的问题。
- 补全异常捕获:给文件读取逻辑包裹try/catch块,捕获Promise异常,很多时候卡住是因为没有做异常捕获,错误日志被Promise吞掉了:
try { var content = await FileSystem.readAsStringAsync(/* 你的路径和参数 */); console.log(content.length); } catch (err) { console.log('读取文件报错:', err); }
进一步排查需补充的信息
如果以上步骤操作后问题仍存在,需要补充以下信息定位根因:
- 当前项目使用的Expo SDK版本、Expo Go客户端版本号
AppConstants.APP_FOLDER、AppConstants.TILE_FOLDER两个常量的实际打印值- 目标main.png文件的实际文件大小
- app.json中iOS端的完整权限配置
- 加了try/catch之后捕获到的具体错误信息
内容的提问来源于stack exchange,提问作者Kareist
相关产品推荐
相关产品推荐

