2015-12-27 4 views
3

людям! Я пытаюсь реализовать аудиомагнитофон на своем веб-сайте. Я хочу, чтобы пользователь сохранил записанный файл непосредственно в базе данных и в подпапку на моем веб-сайте (называемый/speaking_audios). Там следует основные файлы:Как загрузить записанный аудиофайл с помощью pdo в базу данных

recorder.php

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title>FlashWavRecorder demo</title> 
    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js'></script> 
    <script type="text/javascript" src="js/swfobject.js"></script> 
    <script type="text/javascript" src="js/recorder.js"></script> 
    <script type="text/javascript" src="js/main.js"></script> 
    <link rel="stylesheet" href="css/style.css"> 

</head> 

<body> 
    <div class="container"> 

    <h1><a href="https://github.com/cykod/FlashWavRecorder">FlashWavRecorder</a></h1> 
    <p><strong>Upload requires php, i.e. example will not work on github.com</strong></p> 


    <div id="recorder-audio" class="control_panel idle"> 
     <button class="record_button" onclick="FWRecorder.record('audio', 'audio.wav');" title="Record"> 
     <img src="images/record.png" alt="Record"/> 
     </button> 
     <button class="stop_recording_button" onclick="FWRecorder.stopRecording('audio');" title="Stop Recording"> 
     <img src="images/stop.png" alt="Stop Recording"/> 
     </button> 
     <button class="play_button" onclick="FWRecorder.playBack('audio');" title="Play"> 
      <img src="images/play.png" alt="Play"/> 
     </button> 
     <button class="pause_playing_button" onclick="FWRecorder.pausePlayBack('audio');" title="Pause Playing"> 
      <img src="images/pause.png" alt="Pause Playing"/> 
     </button> 
     <button class="stop_playing_button" onclick="FWRecorder.stopPlayBack();" title="Stop Playing"> 
     <img src="images/stop.png" alt="Stop Playing"/> 
     </button> 
     <div class="level"></div> 
    </div> 

    <div id="recorder-audio2" class="control_panel idle"> 
     <button class="record_button" onclick="FWRecorder.record('audio2', 'audio2.wav');" title="Record"> 
     <img src="images/record.png" alt="Record"/> 
     </button> 
     <button class="stop_recording_button" onclick="FWRecorder.stopRecording('audio2');" title="Stop Recording"> 
     <img src="images/stop.png" alt="Stop Recording"/> 
     </button> 
     <button class="play_button" onclick="FWRecorder.playBack('audio2');" title="Play"> 
     <img src="images/play.png" alt="Play"/> 
     </button> 
     <button class="pause_playing_button" onclick="FWRecorder.pausePlayBack('audio2');" title="Pause Playing"> 
     <img src="images/pause.png" alt="Pause Playing"/> 
     </button> 
     <button class="stop_playing_button" onclick="FWRecorder.stopPlayBack();" title="Stop Playing"> 
     <img src="images/stop.png" alt="Stop Playing"/> 
     </button> 
     <div class="level"></div> 
    </div> 

    <div class="details"> 
     <button class="show_level" onclick="FWRecorder.observeLevel();">Show Level</button> 
     <button class="hide_level" onclick="FWRecorder.stopObservingLevel();" style="display: none;">Hide Level</button> 
     <span id="save_button"> 
     <span id="flashcontent"> 
      <p>Your browser must have JavaScript enabled and the Adobe Flash Player installed.</p> 
     </span> 
     </span> 
     <div><button class="show_settings" onclick="microphonePermission()">Microphone permission</button></div> 
     <div id="status"> 
     Recorder Status... 
     </div> 
     <div>Duration: <span id="duration"></span></div> 
     <div>Activity Level: <span id="activity_level"></span></div> 
     <div>Upload status: <span id="upload_status"></span></div> 
    </div> 

    <form id="uploadForm" name="uploadForm" action="upload.php"> 
     <input name="authenticity_token" value="xxxxx" type="hidden"> 
     <input name="upload_file[parent_id]" value="1" type="hidden"> 
     <input name="format" value="json" type="hidden"> 
    </form> 

    <h4>Configure Microphone</h4> 
    <form class="mic_config" onsubmit="return false;"> 
     <ul> 
     <li> 
      <label for="rate">Rate</label> 
      <select id="rate" name="rate"> 
      <option value="44" selected>44,100 Hz</option> 
      <option value="22">22,050 Hz</option> 
      <option value="11">11,025 Hz</option> 
      <option value="8">8,000 Hz</option> 
      <option value="5">5,512 Hz</option> 
      </select> 
     </li> 

     <li> 
      <label for="gain">Gain</label> 
      <select id="gain" name="gain"> 
      </select> 
     </li> 

     <li> 
      <label for="silenceLevel">Silence Level</label> 
      <select id="silenceLevel" name="silenceLevel"> 
      </select> 
     </li> 

     <li> 
      <label for="silenceTimeout">Silence Timeout</label> 
      <input id="silenceTimeout" name="silenceTimeout" value="2000"/> 
     </li> 

     <li> 
      <input id="useEchoSuppression" name="useEchoSuppression" type="checkbox"/> 
      <label for="useEchoSuppression">Use Echo Suppression</label> 
     </li> 

     <li> 
      <input id="loopBack" name="loopBack" type="checkbox"/> 
      <label for="loopBack">Loop Back</label> 
     </li> 

     <li> 
      <button onclick="configureMicrophone();">Configure</button> 
     </li> 
     </ul> 
    </form> 
    </div> 

</body> 
</html> 

таблицы базы данных "записи" SQL структура:

CREATE TABLE `recordings` (
    `id` int(5) NOT NULL AUTO_INCREMENT, 
    `username_id` int(5) NOT NULL, 
    `username` varchar(50) NOT NULL, 
    `upload_file` longblob NOT NULL, 
    `filename` varchar(100) NOT NULL, 
    `currenttime` datetime NOT NULL, 
    `type` longtext NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

config.php

<?php 
try { 
    $pdo = new PDO('mysql:host=localhost;dbname=database','root',''); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

} catch(PDOException $e) { 
    echo 'Error: '.$e->getMessage(); 
} 
?> 

upload.php

<?php 
$save_folder = dirname(__FILE__) . "/speaking_audios"; 
if(! file_exists($save_folder)) { 
    if(! mkdir($save_folder)) { 
    die("failed to create save folder $save_folder"); 
    } 
} 

function valid_wav_file($file) { 
    $handle = fopen($file, 'r'); 
    $header = fread($handle, 4); 
    list($chunk_size) = array_values(unpack('V', fread($handle, 4))); 
    $format = fread($handle, 4); 
    fclose($handle); 
    return $header == 'RIFF' && $format == 'WAVE' && $chunk_size == (filesize($file) - 8); 
} 

$key = 'filename'; 
$tmp_name = $_FILES["upload_file"]["tmp_name"][$key]; 
$upload_name = md5(uniqid() .rand()). ".wav"; 
#$_FILES["upload_file"]["name"][$key]; 
$type = $_FILES["upload_file"]["type"][$key]; 
$filename = "$save_folder/$upload_name"; 
#$filename = "$save_folder/$upload_name"; 
$saved = 0; 
if($type == 'audio/wav' && preg_match('/^[a-zA-Z0-9_\-]+\.wav$/', $upload_name) && valid_wav_file($tmp_name)) { 
    $saved = move_uploaded_file($tmp_name, $filename) ? 1 : 0; 
} 

if($_POST['format'] == 'json') { 
    header('Content-type: application/json'); 
    print "{\"saved\": $saved}"; 
} else { 
    print $saved ? "Saved" : 'Not saved'; 
} 

exit; 

# Save a few info to database 
include "config.php"; 

$username = $_SESSION['username']; 

$stmt = $pdo->prepare("INSERT INTO `recordings` (username, filename, currenttime) VALUES (:username, :filename, NOW())"); 
$stmt->execute(array(':username' => $username, ':filename' => $upload_name)); 

?> 

Ну, я просто хочу, чтобы вы сосредоточились на файле upload.php и посмотрели, что я делаю неправильно. Я не знаю, вызвана ли проблема строкой «exit»; в файле upload.php. Файл сохраняется в подпапке «/ speaking_audios», но не в базе данных. Зачем? Может быть, проблема в upload.php файле строки:

include "config.php"; 

$upload_file=$upload_name; # also $upload_name 
$username_id = $_SESSION['username']; 

$stmt = $pdo->prepare("INSERT INTO `recordings` (username, filename, currenttime) VALUES (:username_id, :upload_file, NOW())"); 
$stmt->execute(array(':username_id' => $username_id, ':upload_file' => $upload_file)); 

Существует также основной аудио контроллер в JavaScript:

JS/main.js

$(function() { 
    var $uploadStatus = $('#upload_status'), 
    $showLevelButton = $('.show_level'), 
    $hideLevelButton = $('.hide_level'), 
    $level = $('.control_panel .level'); 

    var CLASS_CONTROLS = "control_panel"; 
    var CLASS_RECORDING = "recording"; 
    var CLASS_PLAYBACK_READY = "playback_ready"; 
    var CLASS_PLAYING = "playing"; 
    var CLASS_PLAYBACK_PAUSED = "playback_paused"; 

// Embedding flash object --------------------------------------------------------------------------------------------- 

    setUpFormOptions(); 
    var appWidth = 24; 
    var appHeight = 24; 
    var flashvars = {'upload_image': 'images/upload.png'}; 
    var params = {}; 
    var attributes = {'id': "recorderApp", 'name': "recorderApp"}; 
    swfobject.embedSWF("recorder.swf", "flashcontent", appWidth, appHeight, "11.0.0", "", flashvars, params, attributes); 

// Handling FWR events ------------------------------------------------------------------------------------------------ 

    window.fwr_event_handler = function fwr_event_handler() { 
    $('#status').text("Last recorder event: " + arguments[0]); 
    var name, $controls; 
    switch (arguments[0]) { 
     case "ready": 
     var width = parseInt(arguments[1]); 
     var height = parseInt(arguments[2]); 
     FWRecorder.uploadFormId = "#uploadForm"; 
     FWRecorder.uploadFieldName = "upload_file[filename]"; 
     FWRecorder.connect("recorderApp", 0); 
     FWRecorder.recorderOriginalWidth = width; 
     FWRecorder.recorderOriginalHeight = height; 
     $('.save_button').css({'width': width, 'height': height}); 
     break; 

     case "no_microphone_found": 
     break; 

     case "microphone_user_request": 
     recorderEl().addClass("floating"); 
     FWRecorder.showPermissionWindow(); 
     break; 

     case "microphone_connected": 
     FWRecorder.isReady = true; 
     $uploadStatus.css({'color': '#000'}); 
     break; 

     case "permission_panel_closed": 
     FWRecorder.defaultSize(); 
     recorderEl().removeClass("floating"); 
     break; 

     case "microphone_activity": 
     $('#activity_level').text(arguments[1]); 
     break; 

     case "recording": 
     name = arguments[1]; 
     $controls = controlsEl(name); 
     FWRecorder.hide(); 
     setControlsClass($controls, CLASS_RECORDING); 
     break; 

     case "recording_stopped": 
     name = arguments[1]; 
     $controls = controlsEl(name); 
     var duration = arguments[2]; 
     FWRecorder.show(); 
     setControlsClass($controls, CLASS_PLAYBACK_READY); 
     $('#duration').text(duration.toFixed(4) + " seconds"); 
     break; 

     case "microphone_level": 
     $level.css({width: arguments[1] * 50 + '%'}); 
     break; 

     case "observing_level": 
     $showLevelButton.hide(); 
     $hideLevelButton.show(); 
     break; 

     case "observing_level_stopped": 
     $showLevelButton.show(); 
     $hideLevelButton.hide(); 
     $level.css({width: 0}); 
     break; 

     case "playing": 
     name = arguments[1]; 
     $controls = controlsEl(name); 
     setControlsClass($controls, CLASS_PLAYING); 
     break; 

     case "playback_started": 
     name = arguments[1]; 
     var latency = arguments[2]; 
     break; 

     case "stopped": 
     name = arguments[1]; 
     $controls = controlsEl(name); 
     setControlsClass($controls, CLASS_PLAYBACK_READY); 
     break; 

     case "playing_paused": 
     name = arguments[1]; 
     $controls = controlsEl(name); 
     setControlsClass($controls, CLASS_PLAYBACK_PAUSED); 
     break; 

     case "save_pressed": 
     FWRecorder.updateForm(); 
     break; 

     case "saving": 
     name = arguments[1]; 
     break; 

     case "saved": 
     name = arguments[1]; 
     var data = $.parseJSON(arguments[2]); 
     if (data.saved) { 
      $('#upload_status').css({'color': '#0F0'}).text(name + " was saved"); 
     } else { 
      $('#upload_status').css({'color': '#F00'}).text(name + " was not saved"); 
     } 
     break; 

     case "save_failed": 
     name = arguments[1]; 
     var errorMessage = arguments[2]; 
     $uploadStatus.css({'color': '#F00'}).text(name + " failed: " + errorMessage); 
     break; 

     case "save_progress": 
     name = arguments[1]; 
     var bytesLoaded = arguments[2]; 
     var bytesTotal = arguments[3]; 
     $uploadStatus.css({'color': '#000'}).text(name + " progress: " + bytesLoaded + "/" + bytesTotal); 
     break; 
    } 
    }; 

// Helper functions --------------------------------------------------------------------------------------------------- 

    function setUpFormOptions() { 
    var gain = $('#gain')[0]; 
    var silenceLevel = $('#silenceLevel')[0]; 
    for (var i = 0; i <= 100; i++) { 
     gain.options[gain.options.length] = new Option(100 - i); 
     silenceLevel.options[silenceLevel.options.length] = new Option(i); 
    } 
    } 

    function setControlsClass($controls, className) { 
    $controls.attr('class', CLASS_CONTROLS + ' ' + className); 
    } 

    function controlsEl(name) { 
    return $('#recorder-' + name); 
    } 

    function recorderEl() { 
    return $('#recorderApp'); 
    } 


// Button actions ----------------------------------------------------------------------------------------------------- 

    window.microphonePermission = function() { 
    recorderEl().addClass("floating"); 
    FWRecorder.showPermissionWindow({permanent: true}); 
    }; 

    window.configureMicrophone = function() { 
    if (!FWRecorder.isReady) { 
     return; 
    } 
    FWRecorder.configure($('#rate').val(), $('#gain').val(), $('#silenceLevel').val(), $('#silenceTimeout').val()); 
    FWRecorder.setUseEchoSuppression($('#useEchoSuppression').is(":checked")); 
    FWRecorder.setLoopBack($('#loopBack').is(":checked")); 
    }; 

}); 

Когда файл будет сохранен , зеленое сообщение отображается после состояния загрузки в файле recorder.php. То есть при нажатии на стрелку для сохранения/выгрузки upload.php вступает в действие, но не отображается. пользователь, так сказать, остается на странице recorder.php.

ответ

0

Я знаю, где проблема. Это необходимо использовать:

if(isset($_FILES['upload_file'])){ 

до $ stmt. Просто, как ... Решенная проблема.

2

Ничего после выхода не будет выполнено!

просто попробуйте удалить его ...

Кроме того, после вашего запроса попробуйте добавить:

if($stmt->errorCode() == 0) { 
    echo "success"; 
} else { 
    $errors = $stmt->errorInfo(); 
    print_r($errors); 
} 

Это может дать какое-то объяснение.

Также идентификатор выложился дб выполнить перед строкой:

if($_POST['format'] == 'json') { 

Кроме того, только заметил, все ваши поля таблицы установлены на NOT NULL, но вы только вставить 3 поля. Это приведет к ошибке, если они оставлены пустыми.

Ваше username_id поле установлено в целое, и я думаю, что вы, возможно, вы пытаетесь заполнить его с именем пользователя, который может быть VARCHAR

+0

Я сделал это. Тоже самое. Ничего не произошло. –

+0

Ничего не решено. Я также добавил файл javascript main.js выше, чтобы вы знали, как работает этот аудиомагнитофон. Это ссылка на полный флеш-файл: https://github.com/michalstocki/FlashWavRecorder. –

+0

Обновленный оригинальный ответ - проверьте таблицу записей –

Смежные вопросы