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

jQuery结合PHP实现音频录制上传时file_get_contents报错如何解决

问题原因

blob: 开头的URL是浏览器本地临时生成的资源地址,仅在当前用户的浏览器会话内有效,服务器无法访问该地址,所以PHP端调用file_get_contents读取该地址会直接报文件不存在的错误。


前端代码修正

你原来的上传逻辑错误地将blob地址当作音频内容上传,还多余生成了内容为URL字符串的无效Blob对象,修正后的exportWAV回调部分代码如下:

myRecorder.objects.recorder.exportWAV(function (blob) {
    var url = (window.URL || window.webkitURL).createObjectURL(blob);
    // 原有的播放、下载逻辑保留不变
    var audioObject = $('<audio controls></audio>').attr('src', url);
    var downloadObject = $('<a>&#9660;</a>')
        .attr('href', url)
        .attr('download', new Date().toUTCString() + '.wav');
    var holderObject = $('<div class="row"></div>')
        .append(audioObject)
        .append(downloadObject);
    listObject.append(holderObject);

    // 修正后的上传逻辑
    var form_data = new FormData();
    // 直接 append 实际的音频Blob对象,指定文件名
    form_data.append('audio', blob, new Date().getTime() + '.wav');
    $.ajax({
        url: "upload.php", 
        cache: false,
        contentType: false,
        processData: false,
        data: form_data, 
        type: 'post',
        success: function(data) {
            console.log('上传成功', data);
        },
        error: function(e) {
            console.log('上传失败', e);
        }
    });
    // 删掉原来多余的 link变量定义、无效Blob生成、FileReader测试代码即可
});

后端PHP代码修正

现在前端传的是标准文件流,需要从$_FILES中读取数据,不要从$_POST读取,代码如下:

<?php
// 判断是否有合法的文件上传
if (isset($_FILES['audio']) && $_FILES['audio']['error'] === UPLOAD_ERR_OK) {
    // 读取临时文件内容
    $audio_content = file_get_contents($_FILES['audio']['tmp_name']);
    // 自定义保存目录,需要提前创建并给PHP写入权限
    $save_dir = __DIR__ . '/audio/';
    if (!is_dir($save_dir)) {
        mkdir($save_dir, 0755, true);
    }
    $save_path = $save_dir . $_FILES['audio']['name'];
    // 保存文件
    if (file_put_contents($save_path, $audio_content)) {
        echo '上传成功,保存路径:' . $save_path;
    } else {
        echo '保存失败,请检查目录权限';
    }
} else {
    echo '上传错误,错误码:' . ($_FILES['audio']['error'] ?? '无文件上传');
}
// 调试用输出
print_r($_FILES);
print_r($_POST);
?>

额外注意事项

  • 代码里配置的音频保存目录需要提前创建,Windows环境给目录开通Users组读写权限,Linux环境给目录设置0755权限
  • 原来的HTML文件末尾多余的?>要删掉,属于语法错误

内容的提问来源于stack exchange,提问作者Jeevan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:06:03