Expo导出JSON转CSV文件无法保存到下载文件夹问题咨询
解决方案
问题根源
- 调用
FileSystem.writeAsStringAsync时未添加await关键字,文件写入操作还没完成就执行后续创建资源的逻辑,你看到的带_U/_V属性的Promise结构,就是未等待异步执行完成的返回结果 - CSV内容拼接逻辑错误,直接拼接JSON数组对象不会自动转为CSV格式的行数据,缺少换行符和字段遍历、特殊字符转义逻辑
- 缺少异常捕获逻辑,无法定位操作失败的具体原因
调整后可运行代码
CSV = async () => { try { // 1. 完整处理JSON转CSV逻辑 const data = this.state.results; const headers = 'Transaction ID,Title,Amount,Category,Note,Date\n'; // 头部末尾加换行 // 遍历JSON数组拼接每一行数据,处理字段内的引号、逗号等特殊字符转义 const rows = data.map(item => { return [ item.transactionId, item.title, item.amount, item.category, item.note, item.date ].map(field => `"${String(field).replace(/"/g, '""')}"`).join(','); }).join('\n'); const csvContent = headers + rows; // 2. 定义临时写入路径(App私有目录) const tempPath = FileSystem.documentDirectory + "test.csv"; // 3. 申请存储权限 const { status } = await MediaLibrary.requestPermissionsAsync(); if (status !== "granted") { alert("存储权限未授予,无法保存文件"); return; } // 4. 等待文件写入完成再执行后续操作 await FileSystem.writeAsStringAsync(tempPath, csvContent, { encoding: FileSystem.EncodingType.UTF8 }); // 5. 转存到系统公共下载文件夹 const fileAsset = await MediaLibrary.createAssetAsync(tempPath); await MediaLibrary.createAlbumAsync("Download", fileAsset, false); alert("CSV文件已成功保存到系统下载文件夹"); // 可选:清理App私有目录下的临时文件 await FileSystem.deleteAsync(tempPath, { idempotent: true }); } catch (error) { console.error("保存失败:", error); alert("保存失败:" + error.message); } }
验证方式
调整后运行代码,看到成功提示后,直接打开系统自带的「下载」应用,即可找到生成的test.csv文件。
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

