最近在为一国企的老旧项目做改造,由于对方发布端在内网,展示端在外网。需要在发布时进行内容同步,为了方便起见就想到了把内容中的图片全部转换成Base64,POST发送至外网服务器后,再全部转换成图片文件保存在外网服务器中。
贴一个批量将文章内容中的图片替换为Base64格式的代码片段,以便后期方便查找。
- /**
- * 转换新闻发布中出现的图片
- */
- function transNewsParam($param){
- $host = app()->getRootPath()."public";
- $img_file = $host.$param['img'];
- $param['img'] = imgToBase64(str_replace("/",DIRECTORY_SEPARATOR,$img_file));
- $param['content'] = transNewsContent(html_entity_decode($param['content']));
- return $param;
- }
- function transNewsContent($content){
- $pregRule = "/(<[img|IMG].*?src=[\'|\"])(.*?(?:[\.jpg|\.jpeg|\.png|\.gif|\.bmp]))([\'|\"].*?[\/]?>)/";
- $host = app()->getRootPath()."public";
- $result = preg_replace_callback($pregRule, function ($match) use($host){
- # 处理src
- return $match[1].imgToBase64($host.str_replace("/",DIRECTORY_SEPARATOR,$match[2])).$match[3];
- },$content);
- return $result;
- }
- function imgToBase64($img_file) {
- $img_base64 = '';
- if (file_exists($img_file)) {
- $img_info = getimagesize($img_file); // 取得图片的大小,类型等
- $fp = fopen($img_file, "r"); // 图片是否可读权限
- if ($fp) {
- $filesize = filesize($img_file);
- $content = fread($fp, $filesize);
- $file_content = chunk_split(base64_encode($content)); // base64编码
- switch ($img_info[2]) { //判读图片类型
- case 1: $img_type = "gif";
- break;
- case 2: $img_type = "jpg";
- break;
- case 3: $img_type = "png";
- break;
- }
- $img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码
- }
- fclose($fp);
- }
- return $img_base64;
- }
注意:
1、上述涉及图片地址为相对路径,读取时需转换绝对路径。能读取到图像文件方能转换。
2、以上代码部分函数基于Thinkphp6,应用在其他地方时需要自行修改。