PHP中data/base64数据转为图片

先了解一下什么是Data URI scheme

Data URI scheme是在RFC2397中定义的,目的是将一些小的数据通过客户端浏览器处理(通常是JS脚本,canvas压缩处理),直接嵌入到网页中,从而不用再从外部文件载入,减少对服务器端的请求,但增加了客户端的处理压力,适合小数据。

Data URI 的格式,如下所示:

data:[<mime type>][;charset=<charset>][;base64],<encoded data>
其中:
1. data为协议头
2. <mime type>为MIME类型,客户端浏览器会以这个 MIME 类型来解析数据:
    data:,文本数据
    data:text/plain,文本数据
    data:text/html,HTML代码
    data:text/html;base64,base64编码的HTML代码
    data:text/css,CSS代码
    data:text/css;base64,base64编码的CSS代码
    data:text/javascript,Javascript代码
    data:text/javascript;base64,base64编码的Javascript代码
    data:image/gif;base64,base64编码的gif图片数据
    data:image/png;base64,base64编码的png图片数据
    data:image/jpeg;base64,base64编码的jpeg图片数据
    data:image/x-icon;base64,base64编码的icon图片数据
3. charset=<charset> 字符集
4. base64编码方式,base64 编码中仅包含 0-9,a-z,A-Z,+,/,= 等ASCII字符,其中 = 是用来编码补白。可以处理二进制数据,如图片。
5. <encoded data> 编码后的数据,编码后的数据比原始数据体积略大,为原来的4/3。

下面展示一个DATA-URI例子:

data:image/png;base64,iVBORw0KGgoAAAANSUDCGHSFDhEUgAAAAEAAAAkCA
+DSFGHAESDGDFURXCBSDGSiVBORw0KGgoDFHGEFhjipgBJIOhihophHJIPGHIJP
+...省略部分数据...
+NCSVQICAjb4U/gAAACRlBMVEUAAADi6OSMjIxSUlIrXja5trg8rgoDFHGEFhj=

在处理图片上传的时候,为了提高响应速度以及用户的体验,通常会对用户选择的图片进行压缩,然后将图片处理成DATA-URI格式的数据,嵌入到表单隐藏域,发送给服务器。服务器接收到表单数据后,PHP处理DATA-URI的数据比较简单,代码如下:

/**
 * 图片的DATA-URI数据转为图片
 * @param $stream DATA-URI数据
 * @param $savePath 保存路径
 * @return bool|string 保存图片文件路径
 */
function base64toImg($stream, $savePath = '')
{
    if (preg_match('/data:\s*image\/(\w+);base64,/iu', $stream, $match)) {
        // 去掉+
        $tmp_stream = str_replace(' ', '+', $stream);
        // 去掉Data URI scheme
        $tmp_stream = str_replace($match[0], '', $tmp_stream);
        // 解密
        $decode_stream = base64_decode($tmp_stream);
        // 文件保存名 $match[1] 为文件后缀
        $saveName = md5($decode_stream) . '.' . $match[1];
        // 保存的文件名
        $file = $savePath . $saveName;
        return file_put_contents($file, $decode_stream) !== false ? $file : false;
    } else {
        return false;
    }
}

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注