Продолжение этот вопрос:
Я пишу код JavaScript и его сопутствующий код PHP, который, помимо прочего, использует recorderjs записывать файлы WAV через браузер, а затем отправляет их через POST на сервер, который затем сохраняет файлы. Поскольку я использую один и тот же php-скрипт для сохранения нескольких файлов, я отправляю на сервер и имя файла, и файл аудио-блоба.
Проблема, с которой я столкнулся на данный момент, заключается в том, что информация, по-видимому, неправильно отправляется на сервер через POST. Когда я отображаю содержимое $ _POST в php, оно отображает имя файла, но не информацию о BLOB-объектах. Поэтому я получаю файл с правильным именем файла, но он пуст.
Мне нужна помощь на стороне браузера, чтобы правильно разместить информацию и на стороне сервера, чтобы убедиться, что информация обрабатывается таким образом, что это будет читаемый файл WAV.
Вот соответствующий javascript, вдохновленный этот вопрос:
function stopRecording(callback, AudioFormat) {
// Stop the recorder instance
recorder && recorder.stop();
console.log('Stopped recording.');
// Stop the getUserMedia Audio Stream !
// audio_stream.getAudioTracks()[0].stop();
// Use the Recorder Library to export the recorder Audio as a .wav file
// The callback providen in the stop recording method receives the blob
if(typeof(callback) == "function"){
recorder && recorder.exportWAV(function (blob) {
callback(blob);
recorder.clear();
}, (AudioFormat || "audio/wav"));
}
}
И вызов функции, вырванный из контекста для облегчения чтения:
stopRecording(function(AudioBLOB){
var reader = new FileReader();
// this function is triggered once a call to readAsDataURL returns
reader.onload = function(event){
var fd = {};
fd["filename"] = subjectID + itemnumber + ".wav";
fd["audiochunk"] = event.target.result;
$.ajax({
type: 'POST',
url: 'upload_wav.php',
data: fd,
processData: false,
contentType: false
}).done(function(data) {
// print the output from the upload_wav.php script
console.log(data);
});
};
// trigger the read from the reader...
reader.readAsDataURL(AudioBLOB);
}, "audio/wav");
И вот важные биты файла upload_wav.php:
<?php
$target = "audio/";
$data = substr($_POST['audiochunk'], strpos($_POST['audiochunk'], ",") + 1);
// decode it
$decodedData = base64_decode($data);
$fname = $target . $filetag;
// write the data out to the file
$fp = fopen($fname, 'wb') or die ("Unable to open file for writing");
fwrite($fp, $decodedData);
fclose($fp);
?>
Я не обязательно привержен этому решению использования FileReader, а затем AJAX. Другие попытки как этот в итоге я получил правильно названные пустые файлы или файлы, которые казались правильными, но затем не воспроизводились в моем медиаплеере. Я просто хочу что-то, что работает, и я сталкиваюсь с моими ограниченными знаниями и опытом php. Пожалуйста помоги.
Задача ещё не решена.
Других решений пока нет …