大致意思是:给你一段富文本,其中有 base64 格式图片,然后需要你用 PHP 将其中的 base64 图片保存到服务器,并且用生成的 图片URL路径,替换掉原来的 base64图片。下面直接上代码:
public function run($data) { $params['group_id'] = $data['group_id']; $params['title'] = $data['title']; //处理图片,base64转换成文件 $params['content'] = $data['content']; $pattern = '/data:image\/([^;]+).*?"/i'; preg_match_all($pattern, $params['content'],$result); foreach($result[0] as $k => $v){ //原始base64图片 $old_img = rtrim($v,'"'); //图片转换成src格式 $new_img = $this->base64_image_content($old_img); if($new_img){ //替换图片 $params['content'] = str_replace($old_img, env('APP_URL').$new_img, $params['content']); } } $params['is_anonymity'] = $data['is_anonymity']; $params['created_id'] = $data['user_id']; $params['created_at'] = time(); return ['id'=>Apibjy::call('Discuss\Question@HomeCreateTask', $params)]; } public function base64_image_content($image){ $imageName = date("His",time())."_".rand(11111,99999).'.png'; if (strstr($image,",")){ $image = explode(',',$image); $image = $image[1]; } $path = "uploads/images/".date("Ymd",time())."/group"; if (!is_dir($path)){ //判断目录是否存在 不存在就创建 mkdir($path,0777,true); } $imageSrc= $path."/". $imageName; //图片名字 $r = file_put_contents($imageSrc, base64_decode($image));//返回的是字节数 if ($r) { return $imageSrc; }else{ return ''; } }
上面代码 $params["content"] 就是那段传参,实现了PHP将富文本中base64图片保存到服务器,并替换成URL图片路径。
注意:
如果你的图片足够大,base64 足够长,那么很可能代码会报错。
因为 preg_match_all() 方法参数是有长度限制的。
解决办法:在 preg_match() 方法前添加 ini_set('pcre.backtrack_limit', 999999999);
这个参数在php 5.2.0版本之后可用。