wake-up-neo.com

So speichern Sie ein PNG-Image serverseitig aus einer base64-Datenzeichenfolge

Ich verwende das "Canvas2Image" JavaScript-Tool von Nihilogic, um Leinwandzeichnungen in PNG-Bilder zu konvertieren. Was ich jetzt brauche, ist, diese base64-Strings, die dieses Tool generiert, in tatsächliche PNG-Dateien auf dem Server zu verwandeln, die PHP verwenden.

Kurz gesagt, was ich derzeit mache, ist eine Datei auf Client-Seite mit Canvas2Image zu generieren, die Base64-codierten Daten abzurufen und sie mit AJAX an den Server zu senden:

// 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
    }
});

An diesem Punkt empfängt "hidden.php" einen Datenblock, der wie folgt aussieht:data: image/png; base64, iVBORw0KGgoAAAANSUhEUgAABE ...

Von diesem Punkt an bin ich ziemlich ratlos. Nach dem, was ich gelesen habe, glaube ich, dass ich die imagecreatefromstring - Funktion von PHP verwenden sollte, aber ich bin nicht sicher, wie ich tatsächlich ein PNG-Bild aus dem base64-kodierten String erstellen und auf meinem Server speichern kann Bitte helfen!

182
Andrei Oniga

Sie müssen die base64-Bilddaten aus dieser Zeichenfolge extrahieren, dekodieren und anschließend auf der Festplatte speichern.

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

list($type, $data) = explode(';', $data);
list(, $data)      = explode(',', $data);
$data = base64_decode($data);

file_put_contents('/tmp/image.png', $data);

Und als One-Liner:

$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));

Eine effiziente Methode zum Extrahieren, Dekodieren und Prüfen auf Fehler ist:

if (preg_match('/^data:image\/(\w+);base64,/', $data, $type)) {
    $data = substr($data, strpos($data, ',') + 1);
    $type = strtolower($type[1]); // jpg, png, gif

    if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
        throw new \Exception('invalid image type');
    }

    $data = base64_decode($data);

    if ($data === false) {
        throw new \Exception('base64_decode failed');
    }
} else {
    throw new \Exception('did not match data URI with image data');
}

file_put_contents("img.{$type}", $data);
360
drew010

Versuche dies:

file_put_contents('img.png', base64_decode($base64string));

file_put_contents docs

111
Some Guy

Ich musste Leerzeichen durch Pluszeichen str_replace(' ', '+', $img); ersetzen, damit das funktioniert.

Hier ist der vollständige Code

$img = $_POST['img']; // Your data 'data:image/png;base64,AAAFBfj42Pj4';
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
file_put_contents('/tmp/image.png', $data);

Hoffentlich hilft das.

35
Ben

Es ist wert zu sagen, dass das besprochene Thema in RFC 2397 dokumentiert ist - Das URL-Schema für "Daten" ( https://tools.ietf.org/html/rfc2397 )

Aus diesem Grund hat PHP eine native Methode zum Umgang mit solchen Daten - "data: stream wrapper" ( http://php.net/manual/en/wrappers.data.php )

So können Sie Ihre Daten einfach mit PHP - Streams bearbeiten:

$data = 'data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7';

$source = fopen($data, 'r');
$destination = fopen('image.gif', 'w');

stream_copy_to_stream($source, $destination);

fclose($source);
fclose($destination);
11

Mit der Idee von @ dre010 habe ich sie um eine andere Funktion erweitert, die mit jedem Bildtyp funktioniert: PNG, JPG, JPEG oder GIF und gibt dem Dateinamen einen eindeutigen Namen

Die Funktion trennt Bilddaten und Bildtyp

function base64ToImage($imageData){
    $data = 'data:image/png;base64,AAAFBfj42Pj4';
    list($type, $imageData) = explode(';', $imageData);
    list(,$extension) = explode('/',$type);
    list(,$imageData)      = explode(',', $imageData);
    $fileName = uniqid().'.'.$extension;
    $imageData = base64_decode($imageData);
    file_put_contents($fileName, $imageData);
}
9
PolloZen

Nun, Ihre Lösung hängt davon ab, dass das Bild eine JPEG-Datei ist. Für eine allgemeine Lösung habe ich verwendet

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

Bedenken insgesamt:

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

// Extract base64 file for standard data
$fileBin = file_get_contents($data);
$mimeType = mime_content_type($data);

// Check allowed mime type
if ('image/png'==$mimeType) {
    file_put_contents('name.png', $fileBin);
}

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

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

3
Nick Tsai

Eine lineare Lösung.

$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]));
3
Piotr

versuche dies...

$file = $_POST['file']; //your data in base64 'data:image/png....';
$img = str_replace('data:image/png;base64,', '', $file);
file_put_contents('img/imag.png', base64_decode($img));
2
Paline

Dieser Code funktioniert für mich unter dem folgenden Code:

<?php
define('UPLOAD_DIR', 'images/');
$image_parts = explode(";base64,", $_POST['image']);
$image_type_aux = explode("image/", $image_parts[0]);
$image_type = $image_type_aux[1];
$image_base64 = base64_decode($image_parts[1]);
$file = UPLOAD_DIR . uniqid() . '.png';
file_put_contents($file, $image_base64);
?>
2

anhand des Beispiels drew010 habe ich ein Arbeitsbeispiel zum besseren Verständnis erstellt.

imagesaver("data:image/jpeg;base64,/9j/4AAQSkZJ"); //use full base64 data 

function imagesaver($image_data){

    list($type, $data) = explode(';', $image_data); // exploding data for later checking and validating 

    if (preg_match('/^data:image\/(\w+);base64,/', $image_data, $type)) {
        $data = substr($data, strpos($data, ',') + 1);
        $type = strtolower($type[1]); // jpg, png, gif

        if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
            throw new \Exception('invalid image type');
        }

        $data = base64_decode($data);

        if ($data === false) {
            throw new \Exception('base64_decode failed');
        }
    } else {
        throw new \Exception('did not match data URI with image data');
    }

    $fullname = time().$type;

    if(file_put_contents($fullname, $data)){
        $result = $fullname;
    }else{
        $result =  "error";
    }
    /* it will return image name if image is saved successfully 
    or it will return error on failing to save image. */
    return $result; 
}
2
sanjeet bisht

Diese Funktion sollte funktionieren. Dieser hat den Parameter photo, der die base64-Zeichenfolge enthält, und auch den Pfad zu einem vorhandenen Image-Verzeichnis, falls bereits ein vorhandenes Image vorhanden ist, dessen Verknüpfung Sie aufheben möchten, während Sie das neue speichern. 

 public function convertBase64ToImage($photo = null, $path = null) {
    if (!empty($photo)) {
        $photo = str_replace('data:image/png;base64,', '', $photo);
        $photo = str_replace(' ', '+', $photo);
        $photo = str_replace('data:image/jpeg;base64,', '', $photo);
        $photo = str_replace('data:image/gif;base64,', '', $photo);
        $entry = base64_decode($photo);
        $image = imagecreatefromstring($entry);

        $fileName = time() . ".jpeg";
        $directory = "uploads/customer/" . $fileName;

        header('Content-type:image/jpeg');

        if (!empty($path)) {
            if (file_exists($path)) {
                unlink($path);
            }
        }

        $saveImage = imagejpeg($image, $directory);

        imagedestroy($image);

        if ($saveImage) {
            return $fileName;
        } else {
            return false; // image not saved
        }
    }
}
0
Saviour Dela

Es ist einfach :

Stellen wir uns vor, Sie versuchen, eine Datei innerhalb von js Framework, ajax request oder einer mobilen Anwendung (Client-Seite) hochzuladen.

  1. Zuerst senden Sie ein Datenattribut, das eine Base64-kodierte Zeichenfolge enthält.
  2. Auf der Serverseite müssen Sie es dekodieren und in einem lokalen Projektordner speichern.

Hier erfahren Sie, wie Sie dies mit PHPtun.

<?php 

$base64String = "kfezyufgzefhzefjizjfzfzefzefhuze"; // I put a static base64 string, you can implement you special code to retrieve the data received via the request.

$filePath = "/MyProject/public/uploads/img/test.png";

file_put_contents($filePath, base64_decode($base64String));

?>
0