Je travaille sur un projet d'art génératif dans lequel j'aimerais permettre aux utilisateurs d'enregistrer les images résultant d'un algorithme. L'idée générale est la suivante :
- Créer une image sur un Canvas HTML5 en utilisant un algorithme génératif
- Lorsque l'image est terminée, permettez aux utilisateurs d'enregistrer le canevas en tant que fichier image sur le serveur.
- Permettez à l'utilisateur de télécharger l'image ou de l'ajouter à une galerie de pièces produites à l'aide de l'algorithme.
Cependant, je suis bloqué à la deuxième étape. Après un peu d'aide de Google, j'ai trouvé ceci article de blog ce qui semblait être exactement ce que je voulais :
Ce qui a conduit au code 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);
}
et le PHP correspondant (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);
}
?>
Mais cela ne semble rien faire du tout.
En cherchant sur Google, on trouve ceci article de blog qui est basé sur le tutoriel précédent. Ce n'est pas très différent, mais cela vaut peut-être la peine d'essayer :
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Celui-ci crée un fichier (yay) mais il est corrompu et ne semble pas contenir quoi que ce soit. Il semble également être vide (taille de fichier de 0).
Y a-t-il quelque chose de vraiment évident que je fais mal ? Le chemin où je stocke mon fichier est accessible en écriture, donc ce n'est pas un problème, mais rien ne semble se produire et je ne sais pas vraiment comment déboguer cela.
Editar
En suivant le lien de Salvidor Dali, j'ai modifié la requête AJAX comme suit :
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);
}
Et maintenant le fichier image est créé et n'est pas vide ! Il semble que le type de contenu soit important et que le fait de le changer en x-www-form-urlencoded
a permis d'envoyer les données de l'image.
La console renvoie la chaîne (assez grande) de code base64 et le fichier de données fait ~140 kB. Cependant, je ne peux toujours pas l'ouvrir et il semble ne pas être formaté comme une image.
0 votes
Le premier article de blog que vous avez fourni utilise
ajax.send(canvasData );
alors que vous l'utilisez commeajax.send("imgData="+canvasData);
. Par conséquent,$GLOBALS["HTTP_RAW_POST_DATA"]
ne sera pas ce que vous attendez, vous devriez probablement utiliser$_POST['imgData']
.0 votes
stackoverflow.com/questions/3592164/
0 votes
Diodeus : J'utilise déjà la technique qui a été suggérée dans ce fil de discussion ; cependant, ils n'ont pas fourni de détails supplémentaires sur la mise en œuvre et c'est là que je suis bloqué.
0 votes
Lorsque j'affiche les informations sur le fichier (
$data
dans le deuxième code php), tout ce que j'obtiens en retour est une ligne vide. Comment cela se fait-il ? On dirait que les données envoyées ne sont pas correctes, mais il semble que je les envoie comme le montrent les exemples...0 votes
Le code PHP peut être simplifié et rendu plus robuste par l'utilisation de PHP-FileUpload avec son
DataUriUpload
à la place. Il est documenté ici et s'accompagne de plusieurs moyens supplémentaires de validation et de renforcement de la sécurité.