• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage zu base64_decode

Tronjer

Senior HTML'ler
Hallo, ich benötige mal einen Ansatz zu folgendem Problem:

Ausgangslage:
Ich baue mir hier gerade eine Art Live-Bilder-Gallerie mit JavaScript. Dazu verwende ich die neue API getUsermedia() um die Webcam einzuschalten und einen Videostream zu starten. Mit den Canvas-Methoden drawImage() und toDataURL() hole ich mir von dem Stream Einzelbilder, sende diese über einen Ajax-Request an ein PHP-Script und lade darüber die Bilder wieder auf meine Seite. Soweit funktioniert es auch.

Das Problem:
Der Grund, warum ich hier überhaupt Ajax einsetze liegt darin, dass ich die Bilder nicht nur anzeigen lassen, sondern auch in einer Datenbank speichern will. Da die Einzelbilder allerdings dynamisch über Canvas erzeugt werden, existieren sie natürlich nicht physisch auf dem Datenträger, sondern werden per $_POST als endlos lange base64-codierte URL durchgereicht. Das sieht dann so aus:

PHP:
array(1) { ["foo"]=> string(72442) "data:image/png;base64,iVBORw0KGgo..."}

Mein erster Gedanke war nun, den 70k String mit base64_decode() zu verkürzen. Aber dabei kommt immer nur Zeichensalat raus, auch wenn ich mit

PHP:
explode(",", $_POST['foo']);

den Teil "data:image/png;base64," ausschneide.

Vielleicht bin ich mit diesem Ansatz auch auf dem Holzweg, aber trotzdem muss es doch eine Möglichkeit geben, die Bilder in eine Datenbank zu schreiben.
 
Der base64-kodierte String ist hier imho notwendig um nicht irgendwelche Probleme beim AJAX-Request entstehen zu lassen. Speichern kannst Du diesen String direkt in einer Datenbank auch ohne ihn auf Platte zu speichern.

PHP:
mysql_query("INSERT INTO tabelle ( blobspalte ) VALUES (".mysql_real_escape_string(base64_decode($_POST["foo"])).")");
 
Hmm, ok. Zwei Fragen noch, weil ich mit MySQL bisher eher wenig Erfahrungen gesammelt habe:

- Wofür steht der Platzhalter (blobspalte) in deinem Query? Der Stream selber ist ein Blob, aber nicht das Canvas-Image.
- Bevor ich den String mit base64_decode() in die Tabelle schreibe, muss ich doch den Part "data:image/png;base64," ausschneiden, oder?
 
- Wofür steht der Platzhalter (blobspalte) in deinem Query? Der Stream selber ist ein Blob, aber nicht das Canvas-Image.

Das ist kein Platzhalter, das ist der beispielhafte Name der Tabellenspalte in der die Daten gespeichert werden. Musst Du natürlich an deinen Spaltennamen anpassen. Siehe auch manual:
MySQL :: MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax

- Bevor ich den String mit base64_decode() in die Tabelle schreibe, muss ich doch den Part "data:image/png;base64," ausschneiden, oder?

ja, stimmt. Oder Du lässt das gleich weg bevor es per AJAX geschickt wird.
 
Das ist kein Platzhalter, das ist der beispielhafte Name der Tabellenspalte in der die Daten gespeichert werden.

Ah ok, mich hatte die Syntax mit den Klammern und der Begriff blob irritiert. Kenne das nur als: INSERT INTO tbl_name VALUES()

ja, stimmt. Oder Du lässt das gleich weg bevor es per AJAX geschickt wird.

Müsste ich morgen direkt mal ausprobieren. Dieses "Prefix" wird von canvas.toDataUrl() generiert.

Danke dir auf jeden Fall für deine Hilfe.
 
Zurück
Oben