我有一个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值插入到我的数据库中?
答案 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库正确上传文件。