You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:45:45