271 votes

Comment enregistrer une image PNG côté serveur, à partir d'un URI de données base64.

Je suis en train d'utiliser l'outil JavaScript "Canvas2Image" de Nihilogic pour convertir des dessins de canvas 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, c'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 :

// Générer le fichier image
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 à data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABE...

À partir de ce point, je suis un peu perdu. D'après ce que j'ai lu, je crois que je suis censé utiliser la fonction imagecreatefromstring de PHP, mais je ne suis pas sûr de comment créer une image PNG réelle à partir de la chaîne encodée en base64 et la stocker sur mon serveur. Aidez-moi, s'il vous plaît!

0 votes

Vous devez l'analyser. vous pouvez extraire le type d'image à partir de là, puis utiliser base64_decode et enregistrer cette chaîne dans un fichier selon votre type d'image

0 votes

@Constantine Pouvez-vous être plus précis, s'il vous plaît?

7 votes

$data = $_REQUEST['base64data']; $image = explode('base64,', $data); file_put_contents('img.png', base64_decode($image[1]));

11voto

devil_io Points 181

Eh bien, votre solution ci-dessus dépend du fichier image étant un fichier jpeg. Pour une solution générale j'ai utilisé

$img = $_POST['image'];
$img = substr(explode(";",$img)[1], 7);
file_put_contents('img.png', base64_decode($img));

7voto

Nick Tsai Points 1217

Total des préoccupations :

$data = 'data:image/png;base64,AAAFBfj42Pj4';

// Extraire le fichier base64 pour les données standard
$fileBin = file_get_contents($data);
$mimeType = mime_content_type($data);

// Vérifier le type MIME autorisé
if ('image/png'==$mimeType) {
    file_put_contents('name.png', $fileBin);
}

http://php.net/manual/fr/wrappers.data.php

http://php.net/manual/fr/function.mime-content-type.php

6voto

Piotr Points 196

Une solution en une ligne.

$base64string = 'data:image/png;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7';
file_put_contents('img.png', base64_decode(explode(',',$base64string)[1]));

6voto

gaurav daxini Points 479

Ce code fonctionne pour moi, vérifiez le code ci-dessous :

6voto

PYK Points 1225

PHP a déjà un traitement équitable base64 -> fichier transform

Je l'utilise pour le coder de cette manière :

$blob=$_POST['blob']; // base64 provenant d'une URL, par exemple

//Maintenant, sauvons le fichier image :

file_put_contents('myfile.png',file_get_contents($blob));

0 votes

Cela devrait être la réponse acceptée car l'OP a la chaîne base64 formatée comme une URL, commençant par data: image / png; base64, .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X