为什么我的blob读数是一个数组?

时间:2017-05-31 23:32:51

标签: php ajax audio mysqli blob

我有一个HTML5录音机,它产生一个音频blob(由Matt Diamond记录的recorder.js),并对我的PHP文件执行jquery ajax调用。

function audioUpload() {

    recorder && recorder.exportWAV(function(blob) {
        //first look at the blob
        console.log(blob);

        var fd = new FormData();
        fd.append('audioBlob', blob);
        var audioBlob = fd.get('audioBlob');

        //second look at the blob
        console.log(audioBlob);

        $.ajax({
            method: "POST",
            data: fd,
            contentType: false,
            processData: false,
            url: "audioSend.php",
        }).done(function(data) {
            console.log(data);
          })
    });

这里有两个console.log函数报告blob:

在第一个中,控制台读作blob。 1在代码的另一部分中,我用它创建了一个对象URL,并且可以使用HTML5音频标签播放音频,因此它正在工作。

在第二步中,控制台将其作为文件读取。 2我可以理解这一点,因为blob是定义为文件的对象。尽管如此,我不确定为什么它不像第一个实例那样被报告为blob。

将formData对象发布到audioSend.php,在那里我获取值并将其插入到我的数据库中。

$audioBlob = $_FILES['audioBlob'];

$results = mysqli_query($connection, "INSERT INTO audioLog (audio) VALUES ('$audioBlob')");

echo ($audioBlob);

尝试将blob值插入到我的数据库中会抛出“Array to String Conversion”错误,并且回显$ audioBlob确认它被读取为数组。我的MYSQL DB Blob列中显示的值仅为几个字节,而不是我想要的更大的音频blob对象。

为什么blob作为数组读取,如何将REAL blob值插入到我的数据库中?

2 个答案:

答案 0 :(得分:0)

您正在发布数据,因此请通过$ _POST:

访问它
$audioBlob = $_POST['audioBlob'];

此外,使用预准备语句,因为您容易受到SQL注入攻击。

答案 1 :(得分:0)

再看看你的代码,虽然我不是JS程序员,看起来你已经禁用了任何类型的优雅POST,并且只是把原始数据塞进了POST请求。

如果您想获取此数据,则必须打开包含未处理的POST正文的php://input流。例如:

$f_in = fopen('php://input', 'rb');
$f_out = fopen($APPROOT.'/files/foo.bin', 'wb');
while( ! feof($f_in) ) {
    $buf = fread($f_in, 4096);
    fwrite($f_out, $buf);
}
fclose($f_in);
fclose($f_out);

一次将POST数据写入文件$APPROOT.'/files/foo.bin' 4KB,而不是先将整个内容塞入内存。

如果您想将其作为文件上传并在$_FILES中使用,则必须研究如何通过任何JS库正确上传文件。