Blob数据无法转为真实WAV/MP3,上传仅存链接问题求助
解决Recorder.js录音上传Blob URL而非真实音频文件的问题
你当前的核心问题是把Recorder.js生成的Blob临时URL当成Blob对象本身,又将这个URL字符串封装成新Blob上传,导致服务器收到的只是一段文本(Blob URL字符串),而非真实的音频文件。
前端修正:直接上传Recorder导出的原始Blob
Recorder.js的exportWAV()(或exportMP3(),需对应插件)方法会直接返回音频Blob对象,你需要直接将这个Blob放入FormData,而非处理成Blob URL。
正确的前端代码示例
// 假设你已经初始化了Recorder实例,变量名为recorder recorder.exportWAV(function(audioBlob) { // 创建FormData容器,直接添加原始音频Blob const formData = new FormData(); // 参数:表单字段名、Blob对象、自定义文件名(可选,建议带后缀) formData.append('audio_upload', audioBlob, 'recording_' + Date.now() + '.wav'); // 发起AJAX请求 $.ajax({ url: '你的PHP上传接口路径', type: 'POST', data: formData, // 关键配置:禁止jQuery自动设置Content-Type,让浏览器处理multipart/form-data contentType: false, // 关键配置:禁止jQuery处理FormData,避免转成字符串 processData: false, success: function(res) { console.log('上传成功:', res); }, error: function(xhr, err) { console.error('上传失败:', err); } }); });
后端PHP修正:正确接收并保存音频文件
确保PHP能正确识别上传的文件,使用move_uploaded_file处理临时文件:
正确的PHP代码示例
<?php // 检查文件是否上传成功 if ($_FILES['audio_upload']['error'] === UPLOAD_ERR_OK) { $uploadDir = 'uploads/'; // 生成唯一文件名,避免覆盖 $fileName = uniqid() . '_' . basename($_FILES['audio_upload']['name']); $targetPath = $uploadDir . $fileName; // 确保上传目录存在,不存在则创建 if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } // 移动临时文件到目标目录 if (move_uploaded_file($_FILES['audio_upload']['tmp_name'], $targetPath)) { echo json_encode([ 'status' => 'success', 'file_path' => $targetPath ]); } else { echo json_encode([ 'status' => 'error', 'msg' => '文件保存失败,请检查目录权限' ]); } } else { echo json_encode([ 'status' => 'error', 'msg' => '文件上传错误,错误码:' . $_FILES['audio_upload']['error'] ]); } ?>
避坑要点
- 禁止使用
URL.createObjectURL(blob)生成的URL上传:这个URL是浏览器内部临时引用,本质是字符串,不是Blob对象,不能作为音频文件上传。 - AJAX必须保留
contentType: false和processData: false:这两个参数是确保FormData以multipart/form-data格式传输的关键,缺失会导致服务器无法识别文件。 - 检查服务器目录权限:确保
uploads/目录有写入权限(通常设置为0755),否则move_uploaded_file会失败。
内容的提问来源于stack exchange,提问作者sumnkothari
相关产品推荐
相关产品推荐

