当前位置: 代码迷 >> 综合 >> Thinkphp5+ phpqrcode 在线批量生成二维码图片并保存在本地
  详细解决方案

Thinkphp5+ phpqrcode 在线批量生成二维码图片并保存在本地

热度:56   发布时间:2024-03-06 23:58:06.0

第一步: 首先需要先下载phpqrcode包,解压在项目中,我们只用到 phpqrcode.php 文件就可以;

phpqrcode下载链接为: http://phpqrcode.sourceforge.net/

第二步: 我放在了vendor文件夹中,位置大家随意,只要能成功引入即可;

第三步: 写方法,这里主要介绍一下 ajax_add 方法传入需要生成的数量-->num ;  因为我的项目需求二维码需要跟用户绑定,所以status为绑定状态,如果大家不需要的话可以将没有用的字段删除! 

$image_path: 这里是图片生成后保存在项目中的位置(因为后续需要用到这里,所以我将图片保存位置拆分了);这里要特别强调一下: 设置路径的时候千万不要设置为 /uploads/..  这样的,要把uploads前面的/去掉,因为ROOT_PATH 后面跟了\ 如果我们手动再写入/就会冲突,二维码无法生成

$file_path: 这里需要加入 ROOT_PATH拼接上面已经设置好的图片在项目中保存的位置,生成完整的在服务器中保存的路径

思路: for循环传入的需要生成的数量,首先创建数据,然后再调用生成二维码图片的方法根据返回的数据id将二维码图片的路径更新到数据库中

$url: 这里是生成二维码的链接以及参数; 链接必须要加 http:// 或者 https://

$filename: 这里是生成二维码的图片名称以及图片路径,可以设置为false,如果设置为false就不会生成图片了,因为项目需要,所以这里我设置了图片名称

public function ajax_add(){
        $num=$this->request->post('num');
        $data['create_time'] = date('Y-m-d',time());
        $data['status'] = 2;
        $image_path = 'uploads/qrcode/';
        $file_path = ROOT_PATH . $image_path;
        for ($i=1; $i<=$num; $i++)
        {
            $id = Db::name('qrcode')->insertGetId($data);
            $url = "https://xxxx.com/index/index?id=$id";
            $filename = $image_path . $id . '.png';
            $this->qrcode($url,$filename,3,6);
            $image['qrcode'] = $image_path.$id.'.png';
            Db::name('qrcode')->where(['id' => $id])->update($image);
        }
        
        return json(['code' => 1, 'msg' => '生成成功,请稍后']);
        
    }

 这里的方法为调用phpqrcode.php,传入参数,生成图片;

$level:  容错级别,一般情况下按照我的参数生成的二维码扫描没有问题;

$size: 二维码大小

 function qrcode($url,$filename,$level,$size)  
    {  
        Vendor('PHPQrcode.phpqrcode');
        //容错级别  
        $errorCorrectionLevel = intval($level);
        //生成图片大小  
        $matrixPointSize = intval($size);
        //生成二维码图片  
        $Qrcode = new \QRcode();
        //第二个参数false的意思是不生成图片文件,如果你写上‘picture.png’则会在根目录下生成一个png格式的图片文件  
        $Qrcode->png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
    }

 现在,你试试是不是就生成成功啦?