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