Upload von Wave Files

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Upload von Wave Files

    Hallo (nochmal),

    nachdem ich hinsichtlich meines Teamspeakproblems so gute Hilfe bekommen habe, dachte ich ich wende mich nochmals an euch.

    Es ist so, dass ich Wave Files, die bei der Aufnahme von Teamspeaksitzungen entstehen, in meine Datenbank abspeichern möchte. Das habe ich bisher wie folgt implementiert:

    Quellcode

    1. <form enctype="multipart/form-data" action="generalFormhandler.php" method="get">
    2. (...)
    3. <br><br>
    4. <br><br>
    5. Dateiupload:<br/>
    6. <input type="hidden" name="upload" value="true">
    7. <input type="file" name="recordedDiscussion" value="{$recordedDiscussion}"> <br/>
    8. <input name="uploadData" type="submit" value="Hochladen" >
    9. </form>
    10. {else}
    11. Keine Diskussionen vorhanden.
    12. {/if}
    Alles anzeigen


    Nach klick auf Hochladen passiert dann das:

    Quellcode

    1. if(isset($_GET["uploadData"])){
    2. $recordedDiscussion = $_GET["recordedDiscussion"];
    3. $id = $_GET["id"];
    4. echo"Die Datei wurde hochgeladen";
    5. $db->saveData($recordedDiscussion , $id);
    6. }
    7. if(isset($_GET["Dateiuploaded"])){
    8. include_once($BASE."handler_show.php");
    9. }
    Alles anzeigen


    Und hier erfolgt die Speicherung in der Datenbank:

    Quellcode

    1. function saveData($recordedDiscussion , $id){
    2. $this->connect();
    3. $sql = 'INSERT INTO `data` (`file`, `id`)'
    4. . ' VALUES ( \''.$recordedDiscussion.'\', \''.$id.'\');'
    5. . ' ';
    6. if(mysql_query($sql)){
    7. return true;
    8. }else{
    9. return false;
    10. }
    11. }
    Alles anzeigen


    In meiner Datenbank habe ich bereits die Tabelle "data" angelegt, wobei "file" als "longblob" definiert ist. Als Attribut erstell xampp automatisch "binary".

    Wenn ich nun versuche eine .wav hochzuladen steht in der Datenbank unter file der Eintrag: [BLOB - 16 Bytes] . Das kann aber ja nicht sein. Die Datei hat nämlich 6.220.068 Bytes.
    Kann mir jemand einen Tipp geben, wo der Fehler ist?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Chili-Schaf ()

  • Ich kann dir bei deinem Problem ehrlich gesagt nicht weiterhelfen, da ich noch nie Binärdaten in einer Datenbank gespeichert hab. Möchte jedoch ein paar Schen zu deinem Skript sagen:

    1. Solltest du alles, was vom client kommt escapen!
    2. Solltest du dir überlegen, ob du nicht einfach deine wave-Dateien in mp3 konvertierst, das spart jede Menge an Platz!
    3. Solltetst du dir überlegen, ob die nicht jede Datei einen eindeutigen Namen gibst und diesen in einer Datenbank speicherst. Ich weiß nicht in wie weit sich das geändert hat, aber wo wir uns mit Binardatenspeiecherung in einer Datenbank beschäftigt haben, wird uns immer davon abgeraten, da das sehr unperfomant sein soll.
  • d0nut schrieb:

    das forum kann syntaxhighlighting ;) bitte füge das deinen Codes mal hinzu.


    Oh, sorry - ich hab es nochmal neu mit MIT Syntaxhighlighting hochgeladen ;)

    d0nut schrieb:


    Ansonsten sorge mal dafür, dass alle Fehlerunterdrückungen deaktiviert sind. (führende @).
    und du error_reporting(E_ALL) aktiviert hast.
    Und dann lade nochmal etwas erneut hoch.

    Öhm, wo kann man denn error_reporting(E_ALL) aktivieren? Macht man das direkt im Quellcode oder bei dem Editor, den man unterstützt?
  • OK, ich habe jetzt beim Start von meinem Programm (und eigentlich nach jedem Klick den ich tätige) eine Menge Meldungen bzw notices, wobei sich keine davon auf mein Problem bezieht. Diese Anmerkungen beziehen sich auf eine Menge andere Variablen, die ich deklariert habe und die mit dem upload direkt nichts zu tun haben. Das muss doch irgendwie gehen...
  • Lass mich raten. Eine davon ist: Undefined index: recordedDiscussion?

    Das heißt dass es die GET-Variable nicht gibt...
    Es muss nämlich $_FILES['recordedDiscussion'] heißen. Und dort sind auch nicht die Binärdaten drinne, sondern nur Informationen wo die datei temporär abgelegt wurde.
    Am besten du hältst dich einfach an unser Tutorial: [coderwiki]HowTos/MySQL-Dateiupload[/coderwiki]

    Hier noch weiter Infos zum $_FILES Array: de.php.net/manual/de/features.file-upload.php
  • Irgendwie funktioniert das noch nicht. Ich habe zuerst mal den Quellcode im Tutorial kopiert und meine Werte dem angepasst(und auch die Variablen so gelassen und in meinen Funktionen umbenannt). Das sieht dann so aus:

    Quellcode

    1. <h2>Quizze im Kurs {$Kursname} </h2>
    2. <form enctype="multipart/form-data" action="generalFormhandler.php" method="get">
    3. <!-- zur Fallunterscheidung -->
    4. <input type="hidden" name="showQuizzes" value="true">
    5. <input type="hidden" name="course_id" value="{$course_id}">
    6. (...)
    7. <br><br>
    8. {if count($discussion_id) ne 0 }
    9. <table>
    10. <tr>
    11. <td> <strong> Diskussionen </strong> </td>
    12. </tr>
    13. <tr>
    14. <td>
    15. {html_radios name="selectedDiscussion" values=$discussion_id checked=$selected
    16. output=$discussion_name separator="<br />"}
    17. </td>
    18. </tr>
    19. <table>
    20. <input type="submit" name="showDiscussion" value="anzeigen" >
    21. <br><br>
    22. Dateiupload:<br/>
    23. #
    24. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
    25. # <input type="hidden" name="upload" value="true" >
    26. <input type="hidden" name="daten_id" value="1" />
    27. #
    28. <input type="file" name="img" />
    29. #
    30. <input type="submit" name="uploadDataTest" value="Datei Upload" />
    31. #
    32. </form>
    33. <!-- <input type="hidden" name="upload" value="true">
    34. <input type="file" name="recordedDiscussion" value="{$recordedDiscussion}"> <br/>
    35. <input name="uploadData" type="submit" value="Hochladen" > -->
    36. </form>
    37. {else}
    38. Keine Diskussionen vorhanden.
    39. {/if}
    Alles anzeigen


    Wenn "Dateiupload" geklickt folgt das:

    Quellcode

    1. if(isset($_POST["uploadDataTest"])){
    2. //MySQL Connect einfügen
    3. $course_id = $_GET["course_id"];
    4. $pfad_zur_datei = $_FILES['img']['tmp_name'];
    5. echo $pfad_zur_datei;
    6. $data = addslashes(fread(fopen($pfad_zur_datei, "r"), filesize($pfad_zur_datei)));
    7. $db->saveData($course_id, $data , $_FILES);
    8. }
    Alles anzeigen


    Und hier ist die Speicherung in der Datenbank:

    Quellcode

    1. function saveData($course_id, $data , $_FILES){
    2. $this->connect();
    3. mysql_unbuffered_query("INSERT INTO data (file, course_id, filetype)
    4. VALUES ('". $data ."','".$course_id."', '".$_FILES['img']['type']."')");
    5. // $sql = 'INSERT INTO `data` (`file`, `course_id`)'
    6. // . ' VALUES ( \''.$recordedDiscussion.'\', \''.$course_id.'\');'
    7. // . ' ';
    8. // if(mysql_query($sql)){
    9. // return true;
    10. // }else{
    11. // return false;
    12. // }
    13. }
    Alles anzeigen


    Bei der Ausführung speichert er immer noch zu wenig Bytes ab - im Endeffekt genausoviele wie vorher. Bei den Notices, die ich eingestellt habe, steht nichts zu den Variablen, die ich benutze. Ich bin sie noch einmal gründlich durchgegangen - aber nichts...irgendwie hab ich ein riesen Brett vor dem Kopf...