首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从base64数据URI保存服务器端的PNG图像

如何从base64数据URI保存服务器端的PNG图像
EN

Stack Overflow用户
提问于 2012-07-17 03:48:49
回答 16查看 437K关注 0票数 252

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

简而言之,我目前正在做的是使用Canvas2Image在客户端生成一个文件,然后使用AJAX检索base64编码的数据并将其发送到服务器:

代码语言:javascript
复制
// 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“接收一个看起来像图像数据的数据块:/png;base64,iVBORw0KGgoAAAANSUhEUgAABE...

从现在开始,我几乎被难住了。根据我所读到的内容,我认为我应该使用PHP的imagecreatefromstring函数,但我不确定如何从base64编码的字符串创建实际的PNG图像并将其存储在我的服务器上。请帮帮忙!

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2012-07-17 03:55:25

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

代码语言:javascript
复制
$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);

作为一行代码:

代码语言:javascript
复制
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));

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

代码语言:javascript
复制
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);
票数 494
EN

Stack Overflow用户

发布于 2012-07-17 03:52:33

试试这个:

代码语言:javascript
复制
file_put_contents('img.png', base64_decode($base64string));

file_put_contents docs

票数 137
EN

Stack Overflow用户

发布于 2014-03-03 21:21:41

我必须将空格替换为加号str_replace(' ', '+', $img);才能正常工作。

下面是完整的代码

代码语言:javascript
复制
$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);

希望这能有所帮助。

票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11511511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档