Sto lavorando a un progetto di arte generativa in cui vorrei consentire agli utenti di salvare le immagini risultanti da un algoritmo. L'idea generale è:
- Crea un'immagine su una tela HTML5 usando un algoritmo generativo
- Al termine dell'immagine, consentire agli utenti di salvare l'area di disegno come file di immagine sul server
- Consentire all'utente di scaricare l'immagine o aggiungerla a una galleria di pezzi di prodotto utilizzando l'algoritmo.
Tuttavia, sono bloccato sul secondo passo. Dopo un po 'di aiuto da parte di Google, ho trovato questo post sul blog , che sembrava essere esattamente quello che volevo:
Che ha portato al codice JavaScript:
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);
}
e PHP corrispondente (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);
}
?>
Ma questo non sembra fare nulla.
Altro Google cerca questo post sul blog che si basa sul tutorial precedente. Non molto diverso, ma forse vale la pena provare:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Questo crea un file (yay) ma è danneggiato e non sembra contenere nulla. Sembra inoltre essere vuoto (dimensione del file pari a 0).
C'è qualcosa di veramente ovvio che sto sbagliando? Il percorso in cui sto memorizzando il mio file è scrivibile, quindi non è un problema, ma sembra che non stia succedendo nulla e non sono davvero sicuro di come eseguire il debug di questo.
modificare
Seguendo il collegamento di Salvidor Dali ho modificato la richiesta AJAX in:
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);
}
E ora il file immagine è stato creato e non è vuoto! Sembra che il tipo di contenuto sia importante e che modificarlo per x-www-form-urlencoded
consentire l'invio dei dati dell'immagine.
La console restituisce la stringa (piuttosto grande) di codice base64 e il file di dati è ~ 140 kB. Tuttavia, non riesco ancora ad aprirlo e sembra non essere formattato come immagine.
$data
nel secondo codice php) tutto ciò che mi viene restituito è una riga vuota. Perché dovrebbe essere? Sembra che forse i dati inviati non siano corretti, ma sembra che li sto inviando proprio come mostrano gli esempi ...
DataUriUpload
componente. È documentato qui e viene fornito con diversi mezzi aggiuntivi di convalida e applicazione della sicurezza.
ajax.send(canvasData );
mentre lo usi comeajax.send("imgData="+canvasData);
. Pertanto$GLOBALS["HTTP_RAW_POST_DATA"]
non sarà quello che ti aspetti, probabilmente dovresti usare$_POST['imgData']
.