HTML/CSS

PHP 实现图片 Base64 编码与解码

阿里云

我们在传输和处理图片时,Base64 是一个常用的选择,PHP 中就有函数(base64_encode 和 base64_decode)分别负责图片 Base64 编码和图片 Base64 解码,老王昨天在网上找到 2 段关于图片 Base64 编码和解码的 PHP 代码实现,用起来还不错,这里与大家做个分享。

一、PHP 实现图片 Base64 编码

实现思路主要就是先将图片流读取到 -> 使用 base64_encode() 进行进行编码 -> 拼接上前缀(data:image/png;base64,)

也想出现在这里?联系我们
创客主机
  1. /**
  2.  * 图片base64编码
  3.  * @param string $img
  4.  * @param bool $imgHtmlCode
  5.  * author 江南极客
  6.  * @return string
  7.  */
  8. function imgBase64Encode($img = '', $imgHtmlCode = true)
  9. {
  10.     //如果是本地文件
  11.     if(strpos($img,'http') === false && !file_exists($img)){
  12.         return $img;
  13.     }
  14.     //获取文件内容
  15.     $file_content = file_get_contents($img);
  16.     if($file_content === false){
  17.         return $img;
  18.     }
  19.     $imageInfo = getimagesize($img);
  20.     $prefiex = '';
  21.     if($imgHtmlCode){
  22.         $prefiex = 'data:' . $imageInfo['mime'] . ';base64,';
  23.     }
  24.     $base64 = $prefiex.chunk_split(base64_encode($file_content));
  25.     return $base64;
  26. }

二、PHP 实现图片 Base64 解码

相比于编码来说,解码稍微复杂一点,因为在对图片进行 Base64 编码的时候会加入前缀字符串(data:image/png;base64,) ,解码之前需要先去掉这一串字符,PHP 代码实现如下:

  1. /**
  2.  * 片base64解码
  3.  * @param string $base64_image_content 图片文件流
  4.  * @param bool $save_img    是否保存图片
  5.  * @param string $path  文件保存路径
  6.  * author 江南极客
  7.  * @return bool|string
  8.  */
  9. function imgBase64Decode($base64_image_content = '',$save_img = false,$path=''){
  10.     if(empty($base64_image_content)){
  11.         return false;
  12.     }
  13.  
  14.     //匹配出图片的信息
  15.     $match = preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result);
  16.     if(!$match){
  17.         return false;
  18.     }
  19.  
  20.     //解码图片内容(方法一)
  21.     /*$base64_image = preg_split("/(,|;)/",$base64_image_content);
  22.     $file_content = base64_decode($base64_image[2]);
  23.     $file_type = substr(strrchr($base64_image[0],'/'),1);*/
  24.  
  25.     //解码图片内容(方法二)
  26.     $base64_image = str_replace($result[1], '', $base64_image_content);
  27.     $file_content = base64_decode($base64_image);
  28.     $file_type = $result[2];
  29.  
  30.     //如果不保存文件,直接返回图片内容
  31.     if(!$save_img){
  32.         return $file_content;
  33.     }
  34.  
  35.     //如果没指定目录,则保存在当前目录下
  36.     if(empty($path)){
  37.         $path = __DIR__;
  38.     }
  39.     $file_path = $path."/".date('Ymd',time())."/";
  40.     if(!is_dir($file_path)){
  41.         //检查是否有该文件夹,如果没有就创建
  42.         mkdir($file_path,0777,true);
  43.     }
  44.     $file_name = time().".{$file_type}";
  45.     $new_file = $file_path.$file_name;
  46.     if(file_exists($new_file)){
  47.         //有同名文件删除
  48.         @unlink($new_file);
  49.     }
  50.     if (file_put_contents($new_file, $file_content)){
  51.         return $new_file;
  52.     }
  53.     return false;
  54. }

三、在使用 Base64 编码时需要注意的问题

老王昨天在写好服务器端代码后,用在线图片转 Base64 编码工具将一张图片装成了 Base64 编码,再使用在线 Post 进行测试服务器代码时,发现服务器解码得到的图片都是已损坏,无法打开的。后来发现是因为在使用 ajax 传 Base64 编码时,因为 Base64 字符串中有特殊字符,会被转义,所以传到服务器的字符串跟实际的字符串其实不一样,这就导致了 Base64 解码的图片无法打开的问题,后来老王用 Python 写了段测试脚本就没有这个问题了。

如果你也遇到了这个问题,那么老王分享几个网站的解决方案:

1、使用 str.replace(/\&/g,"%26");str.replace(/\+/g,"%2B"); 把字符串中的‘&’、+ 转义

2 、把 base64 图片字符串通过 encodeURIComponent(dataurl) 加密

3、数据格式可以用对象形式传送

PHP 实现图片 Base64 编码与解码

已有 354 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!