php生成二维码并返回给前端页面显示

一、背景

      需求是需要在后台点击生成二维码,然后这个二维码不上传到服务器。我们需要把二维码返回给前台页面,并且显示出来。

二、实现过程

1、生成二维码

      这里使用的是qrcode这个第三方。网上百度,教程一大堆,这里我就不细说了.生成二维码可以参考链接

function index($ctx){
        require_once APP_PATH. '/classes/phpqrcode/phpqrcode.php';
        $link_url="http://www.baidu.com";

        $level="L";
        $size=6;

        ob_start();
        $QRcode = new QRcode();
        $QRcode->png($link_url,false,$level,$size,2);
        logger::info(base64_encode(ob_get_contents()));
        $imageString =base64_encode(ob_get_contents());

        logger::info($imageString);
        ob_end_clean();

        if(ob_end_clean()){
            logger::info('end clen ');
        }

        $data=array(
            'code'=>2,
            'qrcode'=>$imageString
        );
        header("content-type:application/json; charset=utf-8"); 

     !!!(上面这行代码必须有,因为Qrcode::png(),在生成二维码时,内部更改了response的响应类型为image/jpeg,因此需要自己手动设置一下响应头部类型,否则接口无法返回json数据)
        return  $data;

    }

现在要实现的效果是把二维码路径通过接口返回给前端。

      这里需要明确,png()方法返回的是二进制的图片流。所以直接返回是没用的。如果打印返回值的话,我们会发现,返回值是null。所以这里,采用ob_start(),利用缓冲区进行一系列的操作。

把二维码路径返回给前端。

      这里需要明确,png()方法返回的是二进制的图片流。所以直接返回是没用的。如果打印返回值的话,我们会发现,返回值是null。所以这里,采用ob_start(),利用缓冲区进行一系列的操作

1.第一个参数$text,就是上面代码里的URL网址参数,
2.第二个参数$outfile默认为否,不生成文件,只将二维码图片返回,否则需要给出存放生成二维码图片的路径
3.第三个参数$level默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%)。这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比。利用二维维码的容错率,我们可以将头像放置在生成的二维码图片任何区域。
4.第四个参数$size,控制生成图片的大小,默认为4
5.第五个参数$margin,控制生成二维码的空白区域大小
6.第六个参数$saveandprint,保存二维码图片并显示出来,$outfile必须传递图片路径。

第二个参数默认是false,方法返回的是二进制的图片流。生成在缓冲区的,在页面输出的时候会从缓冲区送到浏览器。所以在代码中是使用log输出是不会记录在日志中的,也不需要使用echo进行内容输出。所以直接使用base64_encode(QRcode::png)是没有用的。
  这里使用到了ob_start()方法,打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面。这里就是把生成的图片流从缓冲区保存到内存对象上,使用base64_encode变成编码字符串,通过json返回给页面。

php缓存区相关的操作函数如下。

一、 相关函数简介:
1、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
2、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
4、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用方法:void ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()

 

原文连接 。https://www.jianshu.com/p/768e72938237

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章