Composer安装依赖包
在项目根目录执行下面命令
composer require codeitnowin/barcode
核心实现代码
完整类文件(基于Yii2框架)
该类提供二维码生成、临时文件处理、浏览器下载等完整功能,支持自定义URL、文件名前缀等参数。
<?php
namespace manage\Test;
use CodeItNow\BarcodeBundle\Utils\QrCode;
use common\extensions\Helper;
use yii\helpers\FileHelper;
class TestService
{
/**
* 生成二维码并触发浏览器下载
* @param int $uid 用户ID(默认400570,可自定义传递)
* @return array 错误信息(成功时直接下载,不返回)
* @throws \yii\base\Exception
*/
public function generateQrCode($uid = 400570)
{
// 1. 基础配置定义
$targetUrl = 'http://www.xiaobudiu.top?uid=' . $uid; // 二维码关联的目标URL
$downloadFileName = '小卜丢饭团子' . date('His'); // 浏览器下载时的文件名(不含后缀)
$tempDir = \Yii::$app->basePath . '/runtime/tmp_file/'; // 临时文件存储目录
// 2. 检查并创建临时目录
$dirPath = $this->generateDir($tempDir);
if (!$dirPath) {
return Helper::msg('0', '创建图片临时文件夹失败');
}
// 3. 生成二维码的Base64编码字符串
$imageBase64 = $this->generateImgBase64Str($targetUrl);
// 4. Base64转图片并保存到临时目录
$imageFile = $this->base64ToImg($imageBase64, $tempDir, 'admin_');
if (!$imageFile) {
return Helper::msg('0', '生成二维码图片失败');
}
// 5. 设置HTTP响应头,触发浏览器下载
header('Content-Disposition: attachment; filename=' . $downloadFileName . '.png'); // 下载文件名
header('Content-Type: image/png'); // 图片类型
header('Content-Length: ' . filesize($imageFile)); // 文件大小
header('Cache-Control: no-cache, no-store, must-revalidate'); // 禁用缓存
header('Pragma: no-cache');
header('Expires: 0');
// 6. 输出图片内容到浏览器
readfile($imageFile);
// 7. 清理临时文件(可选,节省服务器存储空间)
unlink($imageFile);
}
/**
* 检查目录是否存在,不存在则创建(支持递归创建多级目录)
* @param string $path 目录路径
* @return string|false 成功返回目录路径,失败返回false
* @throws \yii\base\Exception
*/
public static function generateDir($path)
{
if (FileHelper::createDirectory($path, 0775, true)) {
return $path;
}
return false;
}
/**
* 根据URL生成二维码的Base64编码字符串
* @param string $url 目标URL(需确保合法可访问)
* @return string 二维码图片的Base64编码
*/
public function generateImgBase64Str($url)
{
$qrCode = new QrCode();
// 设置二维码内容、图片类型(PNG),生成Base64字符串
return $qrCode->setText($url)
->setImageType(QrCode::IMAGE_TYPE_PNG)
->generate();
}
/**
* 将Base64编码字符串转换为图片文件并保存
* @param string $base64Str Base64编码的图片数据
* @param string $savePath 图片保存目录(绝对路径)
* @param string|null $prefix 文件名前缀(可选,默认无)
* @return string|false 成功返回图片绝对路径,失败返回false
*/
public function base64ToImg($base64Str, $savePath, $prefix = null)
{
if (empty($base64Str)) {
return false;
}
// 生成唯一文件名(前缀+时间戳+随机数),避免重复
$fileName = $prefix . time() . rand(100, 999) . '.png';
$fullPath = rtrim($savePath, '/') . '/' . $fileName;
// 解码Base64并写入文件
$fileHandle = fopen($fullPath, "wb");
if (!$fileHandle) {
return false;
}
fwrite($fileHandle, base64_decode($base64Str));
fclose($fileHandle);
return $fullPath;
}
}
使用说明
调用方式
在项目中实例化 TestService 类并调用 generateQrCode 方法即可触发二维码下载:
// 示例:在控制器中调用
use manage\Test\TestService;
public function actionQrCode()
{
$testService = new TestService();
// 可传递自定义UID,如:$testService->generateQrCode(10086);
$testService->generateQrCode();
}
参数自定义
-
目标URL修改:直接修改
$targetUrl变量,支持拼接动态参数(如用户ID、订单号等)。 -
下载文件名:修改
$downloadFileName变量,date('His')会生成当前时分秒(如143025),确保文件名唯一。 -
临时目录:修改
$tempDir变量,建议选择有写入权限的目录(如./temp/)。 -
文件名前缀:调用
base64ToImg方法时,可自定义$prefix参数(如改为user_、order_)。
功能效果
-
调用方法后,浏览器会自动触发文件下载,下载文件名为
小卜丢饭团子+时分秒.png(如小卜丢饭团子143025.png)。 -
下载的图片为标准PNG格式,扫描后可跳转至预设的目标URL(如
http://www.xiaobudiu.top?uid=400570)。 -
临时文件生成后会自动删除,避免占用服务器存储空间(可根据需求注释
unlink($imageFile)保留文件)。
五、注意事项
-
确保服务器已安装Composer,且网络可正常访问Packagist仓库(若无法访问,可配置Composer国内镜像)。
-
目录权限:临时存储目录需设置可写入权限(如0775),否则会导致文件创建失败。
-
URL合法性:目标URL需确保格式正确(如包含
http://或https://),否则二维码扫描后无法正常跳转。 -
依赖兼容:
codeitnowin/barcode包支持PHP 5.6+及PHP 7.x、8.x版本,需根据项目PHP版本选择合适的包版本。


