J'utilise l'outil JavaScript "Canvas2Image" de Nihilogic pour convertir des dessins de toile en images PNG. Ce dont j'ai besoin maintenant, c'est de transformer ces chaînes base64 que cet outil génère, en fichiers PNG réels sur le serveur, en utilisant PHP.
En bref, ce que je fais actuellement est de générer un fichier côté client en utilisant Canvas2Image, puis de récupérer les données encodées en base64 et de les envoyer au serveur en utilisant AJAX:
// Generate the image file
var image = Canvas2Image.saveAsPNG(canvas, true);
image.id = "canvasimage";
canvas.parentNode.replaceChild(image, canvas);
var url = 'hidden.php',
data = $('#canvasimage').attr('src');
$.ajax({
type: "POST",
url: url,
dataType: 'text',
data: {
base64data : data
}
});
À ce stade, "hidden.php" reçoit un bloc de données qui ressemble à des données: image / png; base64, iVBORw0KGgoAAAANSUhEUgAABE ...
À partir de ce moment, je suis à peu près perplexe. D'après ce que j'ai lu, je pense que je suis censé utiliser la fonction imagecreatefromstring de PHP , mais je ne sais pas comment créer réellement une image PNG réelle à partir de la chaîne encodée en base64 et la stocker sur mon serveur. Veuillez aider!
la source
Réponses:
Vous devez extraire les données d'image base64 de cette chaîne, les décoder et ensuite vous pouvez les enregistrer sur le disque, vous n'avez pas besoin de GD car c'est déjà un png.
Et en une ligne:
Une méthode efficace pour extraire, décoder et vérifier les erreurs est la suivante:
la source
$type
obtient une valeur de l'explosion, selon qu'il s'agit de données: image / jpg ou de données: image / png etc.Essaye ça:
documentation de file_put_contents
la source
data:image/png;base64,
qui casse le fichier.data:image/png;base64,
la chaîne vers laquelle vous passezbase64_decode
n'est pas valide en base64. Vous n'avez qu'à envoyer les données, c'est ce qu'illustre la réponse de drew010. Il n'y a rien de cassé avec cette réponse. Vous ne pouvez pas copier et coller sans comprendre et vous attendre à ce qu'il "fonctionne simplement".J'ai dû remplacer les espaces par des symboles plus
str_replace(' ', '+', $img);
pour que cela fonctionne.Voici le code complet
J'espère que cela pourra aider.
la source
$img = str_replace(' ', '+', $img);
m'a beaucoup aidé, merci! Pourquoi dois-je convertir l'espace en "+" avant?Il vaut la peine de dire que le sujet discuté est documenté dans la RFC 2397 - Le schéma d'URL "data" ( https://tools.ietf.org/html/rfc2397 )
Pour cette raison, PHP a une manière native de gérer ces données - "data: stream wrapper" ( http://php.net/manual/en/wrappers.data.php )
Vous pouvez donc facilement manipuler vos données avec les flux PHP:
la source
preg_replace
+file_put_contents
?Eh bien, votre solution ci-dessus dépend de l'image étant un fichier jpeg. Pour une solution générale, j'ai utilisé
la source
Prenant l'idée @ dre010, je l'ai étendue à une autre fonction qui fonctionne avec n'importe quel type d'image: PNG, JPG, JPEG ou GIF et donne un nom unique au nom de fichier
La fonction sépare les données d'image et le type d'image
la source
Préoccupations totales:
la source
Solution linéaire.
la source
basé sur l'exemple de drew010 j'ai fait un exemple de travail pour une compréhension facile.
la source
essaye ça...
la source
Ce code fonctionne pour moi, vérifiez le code ci-dessous:
la source
Cette fonction devrait fonctionner. cela a le paramètre photo qui contient la chaîne base64 et également le chemin vers un répertoire d'images existant si vous avez déjà une image existante que vous souhaitez dissocier pendant que vous enregistrez la nouvelle.
la source
C'est simple :
Imaginons que vous essayez de télécharger un fichier dans le cadre js, la demande ajax ou l'application mobile (côté client)
Voici comment le faire en utilisant PHP
la source
Si vous souhaitez renommer des images de manière aléatoire et stocker à la fois le chemin de l'image sur la base de données en tant qu'objet blob et l'image elle-même dans des dossiers, cette solution vous aidera. Les utilisateurs de votre site Web peuvent stocker autant d'images qu'ils le souhaitent, tandis que les images seront renommées de manière aléatoire pour des raisons de sécurité.
Code PHP
Générez des varchars aléatoires à utiliser comme nom d'image.
Obtenez l'extension des données d'image et la partie base_64 (partie après les données: image / png; base64,) de l'image.
la source
PHP a déjà un traitement équitable base64 -> transformation de fichier
J'utilise pour le faire en utilisant cette façon:
la source