php实现输入图片base64值返回图片下载二维码

后端 2018-08-14

思路:将图片base64值转换生成图片文件并保存,将图片保存路径转换成二维码。

二维码的生成使用了phpqrcode类

增加了一个删除的操作,传入开始和结束日期,删除该范围内生成的图片及二维码

<?php
    //包含一个文件上传类中的上传类
    header('Content-Type: text/html; charset=utf-8'); 
    $content = file_get_contents("php://input");
    $content = json_decode($content,true);
    $type = $content['type'];
    $errcode = 0;
    $errtext = "";
    $myJson = array();

    $savepath = 'static/upload/';  //保存base64图片目录
    $qrpath = 'static/qrcode/';   //生成下载地址二维码图片的目录

    if(!$type)
        $errtext = "error param";

    if($errtext == ""){
        switch ($type) {
            case 'upload':
                $base64 = $content['base64'];
                $correctimg = base64_image_content($base64,$savepath);
                if($correctimg){
                    $saveurl ='http://'.$_SERVER['HTTP_HOST'].$correctimg;
                    if($saveurl){
                        $qrimg = scerweima($saveurl);
                        $mybase64 = base64EncodeImage($qrimg);
                        $myJson['mybase64'] = $mybase64;
                    }
                }else{
                    $errtext="error image base64 format";
                }
                break;

            case 'delete':
                $start =date('Ymd',strtotime($content['start']));
                $end = date('Ymd',strtotime($content['end']));
                
                for($i=$start;$i<=$end;$i++){
                    $savefile = $savepath.$i."/";
                    $qrfile = $qrpath.$i."/";
                    if(file_exists($savefile)){
                        //删除保存图片的文件夹
                        deldir($savefile);
                    }

                    if(file_exists($qrfile)){
                        //删除二维码图片的文件夹
                        deldir($qrfile);
                    }   
                }
                break;
            
            default:
                $errtext = "unkonw type";
                break;
        }  
    }

    if($errtext !='')
        $errcode = 1;

    $myJson['errcode'] = $errcode;
    $myJson['errtext'] = $errtext;

   echo json_encode($myJson);
         
    /**
     * [将Base64图片转换为本地图片并保存]
     * @param  [Base64] $base64_image_content [要保存的Base64]
     * @param  [目录] $path [要保存的路径]
     */
    function base64_image_content($base64_image_content,$path)
    {
        //匹配出图片的格式
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
            $type = $result[2];
            $pathname = date('Ymd',time());
            $filename = time();
            $new_file = $path.$pathname."/";
            if(!file_exists($new_file)){
                //检查是否有该文件夹,如果没有就创建,并给予最高权限
                mkdir($new_file, 0700,true);
            }
            $new_file = $new_file.$filename.".{$type}";
            if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
                return '/'.$new_file;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

    /**
     * 生成二维码图片
     * @param url  链接
     * return 返回生成的二维码地址
     */
    function scerweima($url=''){  
        require_once './class/phpqrcode/phpqrcode.php';  
        $value = $url;                  //二维码内容  
        $errorCorrectionLevel = 'L';    //容错级别   
        $matrixPointSize = 5;           //生成图片大小    
        //生成二维码图片  
        $qrname = time();
        $docpath = $GLOBALS['qrpath'].date('Ymd',time());
        if(!file_exists($docpath)){
            //检查是否有该文件夹,如果没有就创建,并给予最高权限
            mkdir($docpath, 0700,true);
        }

        $filename = $docpath.'/'.$qrname.'.png';  
        QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);    
        $QR = $filename;                //已经生成的原始二维码图片文件    
        $QR = imagecreatefromstring(file_get_contents($QR));      
        imagedestroy($QR);  
        return $docpath.'/'.$qrname.'.png';     
    }  

    /**
     * 将图片转换为base64
     * @param image_file    图片文件
     * return base64_image  返回转换后的base64值
     */
    function base64EncodeImage ($image_file) {
        $base64_image = '';
        $image_info = getimagesize($image_file);
        $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
        $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
        return $base64_image;
    }

    /**
     * 删除文件夹
     * @param path  文件夹目录 
     */
    function deldir($path){
        if(is_dir($path)){
            //扫描一个文件夹内的所有文件夹和文件并返回数组
            $p = scandir($path);
            foreach($p as $val){
                //排除目录中的.和..
                if($val !="." && $val !=".."){
                    //如果是目录则递归子目录,继续操作
                    if(is_dir($path.$val)){
                        //子目录中操作删除文件夹和文件
                        deldir($path.$val.'/');
                        //目录清空后删除空文件夹
                        @rmdir($path.$val.'/');
                    }else{
                        //如果是文件直接删除
                        unlink($path.$val);
                    }
                }
            }
        }
    }