汐月兮
汐月兮
  • 发布:2026-03-24 11:38
  • 更新:2026-03-24 11:40
  • 阅读:14

本地录音文件读取失败

分类:uni-app

我在做一个小工具时发现,在连接真机测试时,我在界面上调用设备的麦克风进行录音,然后播放录音文件没有问题,可以当我想把录音文件通过预签名url上传到对象存储中保存时,一直不成功,排查发现是在读取这个录音文件时总是失败,reader.onloadend时就抛异常,可是直接播放这个文件的声音是没问题,不知道该如何处理了,来这里求教大神.

2026-03-24 11:38 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据知识库中的信息,你遇到的问题很可能是由于在 App 端(Android/iOS)使用了 HTML5 的 FileReader API 直接读取本地录音文件路径导致的兼容性问题。录音功能返回的临时文件路径在 App 端是本地文件系统路径,直接使用浏览器端的 FileReader 读取可能会因路径格式或权限问题失败。

解决方案:无需手动读取文件,直接使用 uni.uploadFile 上传临时文件路径

uni.getRecorderManager()onStop 回调返回的 tempFilePath 可以直接用于上传,不需要先读取文件内容再上传。

参考代码实现:

const recorderManager = uni.getRecorderManager();  

export default {  
  data() {  
    return {  
      voicePath: ''  
    }  
  },  
  onLoad() {  
    recorderManager.onStop((res) => {  
      console.log('录音结束:', res);  
      this.voicePath = res.tempFilePath;  
      // 录音完成后直接上传,无需读取文件内容  
      this.uploadVoice(res.tempFilePath);  
    });  
  },  
  methods: {  
    startRecord() {  
      recorderManager.start();  
    },  
    endRecord() {  
      recorderManager.stop();  
    },  
    uploadVoice(filePath) {  
      // 直接使用 uni.uploadFile 上传临时文件路径  
      uni.uploadFile({  
        url: '你的预签名URL', // 预签名上传地址  
        filePath: filePath,   // 录音返回的临时路径  
        name: 'file',         // 根据对象存储要求调整  
        header: {  
          // 根据预签名URL的要求设置header,如Content-Type等  
          'Content-Type': 'audio/mp3' // 或录音时指定的格式  
        },  
        success: (uploadRes) => {  
          console.log('上传成功:', uploadRes);  
        },  
        fail: (err) => {  
          console.error('上传失败:', err);  
        }  
      });  
    }  
  }  
}

如果必须读取文件内容(如需要转换为 Base64):

如知识库对话记录所示,在 App 端建议使用 plus.io API 操作本地文件系统,而非使用 FileReader

// #ifdef APP-PLUS  
plus.io.resolveLocalFileSystemURL(filePath, (entry) => {  
  entry.file((file) => {  
    const reader = new plus.io.FileReader();  
    reader.onloadend = (e) => {  
      console.log('文件内容:', e.target.result);  
    };  
    reader.readAsDataURL(file);  
  });  
});  
// #endif

关键提示:

  1. 录音生成的 tempFilePath 是临时文件,上传完成后如需长期保存,建议及时上传到对象存储
  2. 确保在 manifest.json 中已勾选相应的录音权限模块(Android 需要 RECORD_AUDIO 权限)
  3. 预签名 URL 上传时,注意 URL 的过期时间和请求方式(PUT 或 POST)是否与 uni.uploadFile 配置一致

如需要更复杂的录音处理(如边录边传、实时帧回调),可以参考插件市场的 [Recorder 原生录音插件](https://ext.dcloud.net.cn/plugin?id= xxx),支持文件流式读写和实时上传。

内容为 AI 生成,仅供参考

要回复问题请先登录注册