一、composer安装
http://packagist.p2hp.com/packages/codeitnowin/barcode
二、使用
调用generateQrCode()方法即可实现生成二维码图片并输出下载给用户
<?php
namespace manage\Test;use CodeItNow\BarcodeBundle\Utils\QrCode;
use common\extensions\Helper;
use yii\helpers\FileHelper;class TestService
{/*** 生成二维码图片* @return array* @throws \yii\base\Exception*/public function generateQrCode($uid = 400570){// 进行基础定义$url = 'http://www.xiaobudiu.top?uid=' . $uid;//定义需要生成二维码图片的url$out_put_file_name = '小卜丢饭团子'.date('His');//定义生成的二维码图片名称$tmp_path = \Yii::$app->basePath.'/runtime/tmp_file/';// 定义存储临时文件的临时文件夹路径// 判断如果临时文件夹不存在,则创建临时文件夹(用于存储生成的临时二维码图片)$generate_res = $this->generateDir($tmp_path);if (!$generate_res) {return Helper::msg('0', '创建图片临时文件夹失败');}// 根据url生成二维码图片base64 str$image_base64_str = $this->generateImgBase64Str($url);// 将base64转图片格式,并将图片存储到指定文件夹(返回值为图片的绝对路径)$file = $this->base64_to_img($image_base64_str, $tmp_path, 'admin_');if (!$file) {return Helper::msg('0', '生成二维码图片失败');}// 设置请求头header('Content-Disposition:attachment;filename='.$out_put_file_name.'.png');header('Content-Length:' . filesize($file));// 读取文件并写入到输出缓冲readfile($file);// 为了节省本地资源,删除临时图片(可选)unlink($file);}/*** 判断目录是否存在,如果不存在,则创建,存在则返回* @param $path* @return mixed* @throws \yii\base\Exception*/public static function generateDir($path){if (FileHelper::createDirectory($path, 0775, true)) {return $path;}return false;}/*** 根据url生成二维码图片base64 str*/public function generateImgBase64Str($url){$qr_code = new QrCode();$image_base64_str = $qr_code->setText($url)->setImageType(QrCode::IMAGE_TYPE_PNG)->generate();// 生成图片base64 strreturn $image_base64_str;}/*** base64转图片格式,并将图片存储到指定文件夹*/public function base64_to_img($base64_str, $path, $prefix = null){if($base64_str != ''){$output_file_name = $prefix.time().rand(100,999).'.png';$path .= $output_file_name;$file_handle = fopen($path, "wb");fwrite($file_handle, base64_decode($base64_str));fclose($file_handle);return($path);}return false;}# -------------------------- 备注方法,给不使用yii的同学参考 -------------------------/*** yii框架中的创建文件夹方法,即上面调用的同名方法* @param $path* @param int $mode* @param bool $recursive* @return bool* @throws \yii\base\Exception*/public function createDirectory($path, $mode = 0775, $recursive = true){if (is_dir($path)) {return true;}$parentDir = dirname($path);// recurse if parent dir does not exist and we are not at the root of the file system.if ($recursive && !is_dir($parentDir) && $parentDir !== $path) {static::createDirectory($parentDir, $mode, true);}try {if (!mkdir($path, $mode)) {return false;}} catch (\Exception $e) {if (!is_dir($path)) {// throw new \yii\base\Exception("Failed to create directory \"$path\": " . $e->getMessage(), $e->getCode(), $e);throw new \Exception("Failed to create directory \"$path\": " . $e->getMessage(), $e->getCode(), $e);}}try {return chmod($path, $mode);} catch (\Exception $e) {// throw new \yii\base\Exception("Failed to change permissions for directory \"$path\": " . $e->getMessage(), $e->getCode(), $e);throw new \Exception("Failed to change permissions for directory \"$path\": " . $e->getMessage(), $e->getCode(), $e);}}
}
3、效果
浏览器直接进行下载:
打开下载的图片,效果: