4.5 KiB
4.5 KiB
文件读取问题诊断
🔍 当前问题
从最新日志发现:
- ✅
onStop回调已触发 - ✅ 有文件路径:
_doc/uniapp_temp_1772423197943/recorder/1772423239902.pcm - ❌ 文件路径是相对路径,不是绝对路径
- ❌ 没有看到 "✅ 文件读取成功" 或 "❌ 文件读取失败" 的日志
- ❌ 说明
fs.readFile的回调没有被触发
🔧 已添加的修复
1. 文件路径转换
// 如果是相对路径,转换为绝对路径
let filePath = res.tempFilePath
if (!filePath.startsWith('/') && !filePath.includes('://')) {
// #ifdef APP-PLUS
filePath = plus.io.convertLocalFileSystemURL(filePath)
console.log('📁 转换后的绝对路径:', filePath)
// #endif
}
2. 添加超时保护
let readTimeout = setTimeout(() => {
console.error('❌ 文件读取超时(5秒)')
}, 5000)
3. 增强错误日志
fail: (err) => {
console.error('❌ 文件读取失败:', err)
console.error('错误代码:', err.errCode)
console.error('错误信息:', err.errMsg)
console.error('尝试读取的文件路径:', filePath)
}
🧪 测试步骤
1. 重新编译
在 HBuilderX 中:
- 停止当前运行
- 清理缓存
- 重新运行到手机
2. 测试并观察日志
按住说话 3-5 秒,观察以下关键日志:
⏹️ 录音已停止
📁 文件路径: xxx
📁 转换后的绝对路径: xxx ← 新增!检查路径是否正确
📂 获取文件系统管理器: 成功
📁 准备读取文件: xxx
然后应该看到以下之一:
成功情况:
✅ 文件读取成功
📊 数据类型: object
📊 是否为 ArrayBuffer: true
📊 实际文件大小: 160000 bytes
📦 开始分片发送
失败情况:
❌ 文件读取失败: xxx
错误代码: xxx
错误信息: xxx
超时情况:
❌ 文件读取超时(5秒)
🐛 可能的问题和解决方案
问题 1:文件路径转换失败
症状:
- 没有看到 "📁 转换后的绝对路径" 日志
- 或者转换后的路径还是相对路径
解决方案:
尝试使用 uni.env.USER_DATA_PATH 拼接路径:
let filePath = res.tempFilePath
if (!filePath.startsWith('/')) {
// 使用用户数据目录
filePath = `${uni.env.USER_DATA_PATH}/${filePath}`
console.log('📁 拼接后的路径:', filePath)
}
问题 2:文件不存在
症状:
- 看到 "❌ 文件读取失败"
- 错误信息包含 "file not found" 或类似
解决方案:
检查文件是否真实存在:
// 在读取前先检查文件是否存在
fs.access({
path: filePath,
success: () => {
console.log('✅ 文件存在,开始读取')
// 读取文件
},
fail: () => {
console.error('❌ 文件不存在:', filePath)
}
})
问题 3:权限问题
症状:
- 看到 "❌ 文件读取失败"
- 错误信息包含 "permission denied" 或类似
解决方案:
- 检查 App 权限设置
- 确保在
manifest.json中配置了存储权限:
{
"permissions": {
"WRITE_EXTERNAL_STORAGE": {
"desc": "存储权限"
},
"READ_EXTERNAL_STORAGE": {
"desc": "读取存储权限"
}
}
}
问题 4:录音格式问题
症状:
- 文件读取成功
- 但是文件大小为 0 或很小
解决方案:
尝试修改录音格式:
const recorderOptions = {
format: 'aac', // 改为 aac 格式
// ... 其他参数
}
📝 备用方案:使用 plus.io
如果 uni.getFileSystemManager() 一直有问题,可以尝试使用 plus.io:
// #ifdef APP-PLUS
plus.io.resolveLocalFileSystemURL(res.tempFilePath, (entry) => {
entry.file((file) => {
const reader = new plus.io.FileReader()
reader.onloadend = (e) => {
console.log('✅ 文件读取成功')
const arrayBuffer = e.target.result
this.sendAudioInChunks(arrayBuffer)
}
reader.readAsArrayBuffer(file)
})
}, (err) => {
console.error('❌ 文件读取失败:', err)
})
// #endif
🚀 下一步
- 重新编译并测试
- 观察新增的日志
- 根据日志确定具体问题
- 如果还有问题,提供完整日志
重点关注:
- 📁 转换后的绝对路径是什么?
- ✅ 文件读取成功 还是 ❌ 文件读取失败?
- 如果失败,错误代码和错误信息是什么?