如何保存一个PNG图像服务器端,从base64数据URI

我使用Nihilogic的“Canvas2Image”JavaScript工具将画布图纸转换为PNG图像。 我现在需要的是将这个工具生成的base64字符串转换为服务器上的实际PNG文件,使用PHP

简而言之,我目前所做的是在客户端使用Canvas2Image生成一个文件,然后检索base64编码的数据并使用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
}
});

此时,"hidden.php"接收到一个类似< em >数据:图像/ png; base64, iVBORw0KGgoAAAANSUhEUgAABE…< / em >的数据块

从这一点开始,我几乎被难住了。从我所读到的,我相信我应该使用PHP的imagecreatefromstring函数,但我不确定如何从base64编码的字符串实际创建一个PNG图像并将其存储在我的服务器上。 请帮助!< / p >
478852 次浏览

试试这个:

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

file_put_contents docs

你需要从这个字符串中提取base64图像数据,解码它,然后你可以将它保存到磁盘,你不需要GD,因为它已经是png。

$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);

简单来说:

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

提取、解码和检查错误的有效方法是:

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 = str_replace( ' ', '+', $data );
$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);

我不得不用加号str_replace(' ', '+', $img);替换空格来让这个工作。

这里是完整的代码

$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);

希望这能有所帮助。

试试这个…

$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));

好吧,上面的解决方案取决于图像是一个jpeg文件。我用的是通解

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

值得一提的是,讨论的主题被记录在RFC 2397 - The &;data&;URL方案(https://www.rfc-editor.org/rfc/rfc2397)

正因为如此,PHP有一种原生的方式来处理这样的数据——“数据:流包装器”。(http://php.net/manual/en/wrappers.data.php)

所以你可以很容易地用PHP流操作你的数据:

$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);

采用@dre010的想法,我已经将其扩展到另一个函数,该函数适用于任何图像类型:PNG, JPG, JPEG或GIF,并为文件名提供了唯一的名称

该功能分离图像数据和图像类型

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

一个线性的解决方案。

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

这段代码为我检查以下代码:

<?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);
?>

这个函数应该可以工作。它有一个photo参数,保存base64字符串,还有一个现有图像目录的路径,如果你已经有一个现有的图像,你想要在保存新图像时解除链接。

 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
}
}
}

基于drew010的例子,我做了一个工作的例子,便于理解。

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

总担心:

$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/en/wrappers.data.php

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

很简单:

让我们想象一下,你正在尝试在js框架中上传一个文件,ajax请求或移动应用程序(客户端)

    首先,您发送一个包含base64编码的数据属性 李字符串。< / > 在服务器端,您必须解码它并将其保存在本地 李项目文件夹。< / >

这里如何使用PHP来做

<?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));


?>

如果您想随机重命名图像,并将图像路径存储在数据库中的blob和图像本身存储在文件夹中,这个解决方案将帮助您。您的网站用户可以存储尽可能多的图像,而图像将随机重命名为安全目的。

Php代码

生成随机varchars作为图像名称。

function genhash($strlen) {
$h_len = $len;
$cstrong = TRUE;
$sslkey = openssl_random_pseudo_bytes($h_len, $cstrong);
return bin2hex($sslkey);
}
$randName = genhash(3);
#You can increase or decrease length of the image name (1, 2, 3 or more).


从image中获取图像数据扩展名和base_64部分(data:image/png;base64之后的部分)。

$pos  = strpos($base64_img, ';');
$imgExten = explode('/', substr($base64_img, 0, $pos))[1];
$extens = ['jpg', 'jpe', 'jpeg', 'jfif', 'png', 'bmp', 'dib', 'gif' ];


if(in_array($imgExten, $extens)) {


$imgNewName = $randName. '.' . $imgExten;
$filepath = "resources/images/govdoc/".$imgNewName;
$fileP = fopen($filepath, 'wb');
$imgCont = explode(',', $base64_img);
fwrite($fileP, base64_decode($imgCont[1]));
fclose($fileP);


}


# => $filepath <= This path will be stored as blob type in database.
# base64_decoded images will be written in folder too.


# Please don't forget to up vote if you like my solution. :)

PHP已经有了一个公平的处理base64→文件转换

我以前是这样编码的:

$blob=$_POST['blob']; // base64 coming from an url, for example


//Now, let's save the image file:


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

假设你在$filename中有文件名,在$testfile my onlineer中有base64encoded字符串:

file_put_contents($filename,base64_decode(explode(',', $testfile)[1]))

我希望这对你有帮助。 我用core php方法解决了这个问题。 我解决的代码如下所示
$base64string = 'BASE64 STRING GOES HERE';
$uploadpath   = 'YOUR UPLOAD DIR PATH';
$parts        = explode(";base64,", $base64string); //THIS WILL GET THE ORIGINAL FILE ENCODE STRING
$imagebase64  = base64_decode($parts[1]); //THIS WILL GET THE DECODED IMAGE STRING
$file         = $uploadpath . uniqid() . '.png'; // THIS WILL GIVE THE FILE NAME AND SET THE FILE PATH
file_put_contents($file, $imagebase64); // THIS FUNCTION WILL STORE THE IMAGE TO GIVEN PATH WITH FILE_NAME