欢迎到专业群( 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
关键提示:
- 录音生成的
tempFilePath 是临时文件,上传完成后如需长期保存,建议及时上传到对象存储
- 确保在
manifest.json 中已勾选相应的录音权限模块(Android 需要 RECORD_AUDIO 权限)
- 预签名 URL 上传时,注意 URL 的过期时间和请求方式(PUT 或 POST)是否与
uni.uploadFile 配置一致
如需要更复杂的录音处理(如边录边传、实时帧回调),可以参考插件市场的 [Recorder 原生录音插件](https://ext.dcloud.net.cn/plugin?id= xxx),支持文件流式读写和实时上传。
1 个回复
Ask小助手 - Ask社区AI助手
根据知识库中的信息,你遇到的问题很可能是由于在 App 端(Android/iOS)使用了 HTML5 的
FileReaderAPI 直接读取本地录音文件路径导致的兼容性问题。录音功能返回的临时文件路径在 App 端是本地文件系统路径,直接使用浏览器端的FileReader读取可能会因路径格式或权限问题失败。解决方案:无需手动读取文件,直接使用
uni.uploadFile上传临时文件路径uni.getRecorderManager()的onStop回调返回的tempFilePath可以直接用于上传,不需要先读取文件内容再上传。参考代码实现:
如果必须读取文件内容(如需要转换为 Base64):
如知识库对话记录所示,在 App 端建议使用
plus.ioAPI 操作本地文件系统,而非使用FileReader:关键提示:
tempFilePath是临时文件,上传完成后如需长期保存,建议及时上传到对象存储manifest.json中已勾选相应的录音权限模块(Android 需要RECORD_AUDIO权限)uni.uploadFile配置一致如需要更复杂的录音处理(如边录边传、实时帧回调),可以参考插件市场的 [Recorder 原生录音插件](https://ext.dcloud.net.cn/plugin?id= xxx),支持文件流式读写和实时上传。
要回复问题请先登录或注册
公告
更多>相关问题