Je travaille sur un projet d'art génératif où j'aimerais permettre aux utilisateurs de sauvegarder les images résultantes d'un algorithme. L'idée générale est:
- Créer une image sur un canevas HTML5 à l'aide d'un algorithme génératif
- Une fois l'image terminée, autorisez les utilisateurs à 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 coincé sur la deuxième étape. Après un peu d'aide de Google, j'ai trouvé ce billet de blog , 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 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.
Plus Google recherche ce blog qui est basé sur le tutoriel précédent. Pas très différent, mais peut-être mérite un essai:
$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 (ouais) mais il est corrompu et ne semble rien contenir. 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.
Éditer
Suite au lien de Salvidor Dali, j'ai changé la demande AJAX pour qu'elle soit:
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 changer pour x-www-form-urlencoded
autoriser l'envoi des données d'image.
La console renvoie la chaîne (plutôt volumineuse) de code base64 et le fichier de données est ~ 140 Ko. Cependant, je ne peux toujours pas l'ouvrir et il ne semble pas être formaté en tant qu'image.
la source
ajax.send(canvasData );
que vous avez fournies pendant que vous l'utilisezajax.send("imgData="+canvasData);
. Par conséquent,$GLOBALS["HTTP_RAW_POST_DATA"]
ce ne sera pas ce que vous attendez, vous devriez probablement l'utiliser$_POST['imgData']
.$data
dans le deuxième code php), tout ce que je reçois est une ligne vierge. Pourquoi serait-ce? Il semble que les données envoyées ne soient peut-être pas correctes, mais il semble que je les envoie comme le montrent les exemples ...DataUriUpload
composant à la place. Il est documenté ici et est livré avec plusieurs moyens supplémentaires de validation et d'application de la sécurité.Réponses:
Voici un exemple de réalisation de ce dont vous avez besoin:
1) Dessinez quelque chose (tiré du tutoriel de toile )
2) Convertir l'image de canevas au format URL (base64)
3) Envoyez-le à votre serveur via Ajax
3) Enregistrez base64 sur votre serveur en tant qu'image (voici comment faire cela en PHP , les mêmes idées sont dans tous les langages. Côté serveur en PHP peut être trouvé ici ):
la source
You send it to your server as an ajax request
cette méthode nécessite-t-elle la confirmation de l'utilisateur? Ou puis-je envoyer silencieusement l'image de la toile au serveur?J'ai joué avec ça il y a deux semaines, c'est très simple. Le seul problème est que tous les tutoriels ne parlent que de l'enregistrement local de l'image. Voici comment je l'ai fait:
1) J'ai créé un formulaire pour pouvoir utiliser une méthode POST.
2) Lorsque l'utilisateur a fini de dessiner, il peut cliquer sur le bouton "Enregistrer".
3) Lorsque le bouton est cliqué, je prends les données d'image et les mets dans un champ caché. Après cela, je soumets le formulaire.
4) Lorsque le formulaire est soumis, j'ai ce petit script php:
la source
Je pense que vous devriez transférer l'image en base64 vers l'image avec blob, car lorsque vous utilisez l'image base64, cela prend beaucoup de lignes de journal ou beaucoup de lignes seront envoyées au serveur. Avec blob, c'est seulement le fichier. Vous pouvez utiliser ce code ci-dessous:
Et le code canvas ici:
Après cela, vous pouvez utiliser ajax avec Form:
Ce code utilise la syntaxe CoffeeScript.
si vous souhaitez utiliser javascript, veuillez coller le code sur http://js2.coffee
la source
Envoyer une image de canevas à PHP:
Voici le script PHP:
photo_upload.php
la source
Si vous souhaitez enregistrer des données dérivées d'une
canvas.toDataURL()
fonction Javascript , vous devez convertir les blancs en plus. Si vous ne le faites pas, les données décodées sont corrompues:http://php.net/manual/ro/function.base64-decode.php
la source
J'ai travaillé sur quelque chose de similaire. J'ai dû convertir une image encodée en Base64 sur toile
Uint8Array Blob
.la source
En plus de la réponse de Salvador Dali:
côté serveur, n'oubliez pas que les données sont au format de chaîne base64 . C'est important car dans certains langages de programmation, vous devez dire explicitement que cette chaîne doit être considérée comme des octets et non comme une simple chaîne Unicode.
Sinon, le décodage ne fonctionnera pas: l'image sera enregistrée mais ce sera un fichier illisible.
la source