Ich arbeite an einem generativen Kunstprojekt, bei dem ich Benutzern ermöglichen möchte, die resultierenden Bilder von einem Algorithmus zu speichern. Die allgemeine Idee ist:
- Erstellen Sie ein Bild auf einem HTML5-Canvas mithilfe eines generativen Algorithmus
- Wenn das Bild fertig ist, können Benutzer die Zeichenfläche als Bilddatei auf dem Server speichern
- Ermöglichen Sie dem Benutzer, das Bild entweder herunterzuladen oder einer Galerie von Stücken hinzuzufügen, die mit dem Algorithmus erstellt wurden.
Ich stecke jedoch beim zweiten Schritt fest. Nach etwas Hilfe von Google fand ich diesen Blog-Beitrag , der genau das zu sein schien, was ich wollte:
Was zum JavaScript-Code führte:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var ajax = new XMLHttpRequest();
ajax.open("POST", "testSave.php", false);
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.setRequestHeader("Content-Type", "application/upload");
ajax.send("imgData=" + canvasData);
}
und entsprechendes PHP (testSave.php):
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
$imageData = $GLOBALS['HTTP_RAW_POST_DATA'];
$filteredData = substr($imageData, strpos($imageData, ",") + 1);
$unencodedData = base64_decode($filteredData);
$fp = fopen('/path/to/file.png', 'wb');
fwrite($fp, $unencodedData);
fclose($fp);
}
?>
Aber das scheint überhaupt nichts zu bewirken.
Mehr Googeln zeigt diesen Blog-Beitrag an, der auf dem vorherigen Tutorial basiert. Nicht sehr unterschiedlich, aber vielleicht einen Versuch wert:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Dieser erstellt eine Datei (yay), aber sie ist beschädigt und scheint nichts zu enthalten. Es scheint auch leer zu sein (Dateigröße 0).
Gibt es etwas wirklich Offensichtliches, das ich falsch mache? Der Pfad, in dem ich meine Datei speichere, ist beschreibbar, das ist also kein Problem, aber es scheint nichts zu passieren, und ich bin mir nicht sicher, wie ich das debuggen soll.
Bearbeiten
Nach Salvidor Dalis Link habe ich die AJAX-Anfrage wie folgt geändert:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var xmlHttpReq = false;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
ajax.open("POST", "testSave.php", false);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.send("imgData=" + canvasData);
}
Und jetzt wird die Bilddatei erstellt und ist nicht leer! Es scheint, als ob der Inhaltstyp wichtig ist und dass das Ändern des Inhaltstyps x-www-form-urlencoded
das Senden der Bilddaten ermöglicht.
Die Konsole gibt die (ziemlich große) Zeichenfolge von base64-Code zurück und die Datendatei ist ~ 140 kB groß. Ich kann es jedoch immer noch nicht öffnen und es scheint nicht als Bild formatiert zu sein.
quelle
ajax.send(canvasData );
während Sie ihn verwendenajax.send("imgData="+canvasData);
. Daher$GLOBALS["HTTP_RAW_POST_DATA"]
wird nicht das sein, was Sie erwarten, sollten Sie wahrscheinlich verwenden$_POST['imgData']
.$data
im zweiten PHP-Code) wiedergebe, erhalte ich nur eine leere Zeile zurück. Warum sollte das so sein? Es scheint, als ob die gesendeten Daten vielleicht nicht korrekt sind, aber es scheint, dass ich sie sende, genau wie die Beispiele zeigen ...DataUriUpload
Komponente verwendet wird. Es ist hier dokumentiert und verfügt über mehrere zusätzliche Methoden zur Validierung und Durchsetzung der Sicherheit.Antworten:
Hier ist ein Beispiel, wie Sie das erreichen, was Sie brauchen:
1) Zeichne etwas (aus dem Canvas-Tutorial )
2) Konvertieren Sie das Canvas-Bild in das URL-Format (base64).
3) Senden Sie es über Ajax an Ihren Server
3) Speichern Sie base64 auf Ihrem Server als Image (so geht 's in PHP , die gleichen Ideen gibt es in jeder Sprache. Die Serverseite in PHP finden Sie hier ):
quelle
You send it to your server as an ajax request
Erfordert diese Methode eine Bestätigung des Benutzers? Oder kann ich stillschweigend Bilder von der Leinwand an den Server senden?Ich habe vor zwei Wochen damit gespielt, es ist sehr einfach. Das einzige Problem ist, dass in allen Tutorials nur über das lokale Speichern des Bildes gesprochen wird. So habe ich es gemacht:
1) Ich habe ein Formular eingerichtet, damit ich eine POST-Methode verwenden kann.
2) Wenn der Benutzer mit dem Zeichnen fertig ist, kann er auf die Schaltfläche "Speichern" klicken.
3) Wenn auf die Schaltfläche geklickt wird, nehme ich die Bilddaten und lege sie in ein verstecktes Feld. Danach sende ich das Formular.
4) Wenn das Formular gesendet wird, habe ich dieses kleine PHP-Skript:
quelle
Ich denke, Sie sollten das Image in Base64 auf das Image mit Blob übertragen, da bei Verwendung des Base64-Images viele Protokollzeilen erforderlich sind oder viele Zeilen an den Server gesendet werden. Mit Blob ist es nur die Datei. Sie können diesen Code unten verwenden:
Und Canvas-Code hier:
Danach können Sie Ajax mit Form verwenden:
Dieser Code verwendet die CoffeeScript-Syntax.
Wenn Sie Javascript verwenden möchten, fügen Sie den Code bitte in http://js2.coffee ein
quelle
Leinwandbild an PHP senden:
Hier ist das PHP-Skript:
photo_upload.php
quelle
Wenn Sie Daten speichern möchten, die von einer Javascript-
canvas.toDataURL()
Funktion abgeleitet sind, müssen Sie Leerzeichen in Plusses konvertieren. Wenn Sie dies nicht tun, sind die dekodierten Daten beschädigt:http://php.net/manual/ro/function.base64-decode.php
quelle
Ich habe an etwas ähnlichem gearbeitet. Musste Canvas Base64-codiertes Bild in konvertieren
Uint8Array Blob
.quelle
Zusätzlich zu Salvador Dalis Antwort:
Vergessen Sie auf der Serverseite nicht, dass die Daten im Base64- Zeichenfolgenformat vorliegen. Dies ist wichtig, da Sie in einigen Programmiersprachen explizit angeben müssen, dass diese Zeichenfolge als Byte und nicht als einfache Unicode-Zeichenfolge betrachtet werden soll.
Andernfalls funktioniert die Dekodierung nicht: Das Bild wird gespeichert, es handelt sich jedoch um eine nicht lesbare Datei.
quelle