作为当前网络上最为常见的传输8Bit字节代码的编码方式之一,base64越来越受到人们的喜爱,base64的主要功能不是加密,而是把某些二进制数转成普通字符用于网络传输。由于这些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下。虽然图片可能直接已二进制文件传输,但是我们也可以将它变成字符串直接放在源码里,而不需要浏览器在读取到源码后再从服务器上下载。
而PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码。
编码的时候,只要将图片流读取到,而后使用base64_encode进行进行编码即可得到。
而解码就略微麻烦一点,究其原因在于把图片编码成base64字符串后,编码内会加入这些字符 data:image/png;base64,本来是用于base64进行识别的。但是如果直接放到php里用base64_decode函数解码会导致最终保存的图片文件格式损坏,而解决方法就是先去掉这一串字符,上代码:
<?php
header("Content-Type: text/html;charset=utf-8;");
//计算日期的关键函数
//strtotime() 函数将任何英文文本的日期或时间描述解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数)。
function encodeImageToBase64($file){
if($fp = fopen($file,"rb", 0))
{
$gambar = fread($fp,filesize($file));
fclose($fp);
$base64 = chunk_split(base64_encode($gambar));
return $base64;
}
}
//注意,saveBase64Image函数保存的时候,使用的是纯base64数据,一般客户端通过Http协议发送过来
//数据中还包含一些协议信息(data:image/jpg;base64,)所需需要去掉多余的信息,才能保证存储的文件不会出错.
//如果直接从http请求中获取图片base64数据, 可以直接使用saveBase64Image2函数.
function saveBase64Image($base64Data, $savePath){
// 创建将数据流文件写入我们创建的文件内容中
$fp = fopen( $savePath, "wb" );
if($fp) {
fwrite($fp, base64_decode($base64Data));
fclose($fp);
return true;
}else{
return false;
}
//第二种方式
/*
if (file_put_contents($savePath, base64_decode($base64Data))){
return true;
}else{
return false;
}
*/
}
//将图片Base64转换为本地图片并保存
function saveBase64Image2($base64_image_data,$path)
{
//读取图片格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_data, $result)) {
$type = $result[2];
$save_file = $path . "/" . date('Ymd', time()) . "/";
if (!file_exists($save_file)) {
//检查是否有该文件夹,如果没有就创建,并给予最高权限
mkdir($save_file, 0700);
}
$save_file = $save_file . time() . ".{$type}";
if (file_put_contents($save_file, base64_decode(str_replace($result[1], '', $base64_image_data)))) {
return '/' . $save_file;
} else {
return false;
}
} else {
return false;
}
}
$file = "mm.png"; //本地文件名称,请自行替换为正确的要编解码的图片文件
$base64Data = encodeImageToBase64($file);
//在浏览器中使用img标签,输出并显示图片
$encode = '<img src="data:image/jpg/png/gif;base64,' . $base64Data .'" ><br/>';
echo $encode;
//echo $base64Data; //输出base64编码后的图片字符串数据,因数据太多,不在直接显示
//这里记得把路径改成你自己要存储的位置
$saveFile = "/Library/WebServer/Documents/JBSage/mm_new.png";
//解码并存储图片
decodeAndSaveBase64Image($base64Data,$saveFile);