PHP将富文本中base64图片保存到服务器,并替换成URL路径
2019-02-13| 程成| 760| 0| PHP技术

大致意思是:给你一段富文本,其中有 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版本之后可用。



×
作者:程成
QQ:492245711