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.
$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.
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']
.