前端页面
前端代码
海报生成
PHP代码
request->request('name');
$date = $this->request->request('date');
$sequence = $this->request->request('sequence');
if (empty ($_FILES ['logo'] ['name']) || empty ($_FILES ['posters'] ['name']) || empty ($_FILES ['url'] ['name']) || empty($name) || empty($date) || empty($sequence)) {
$this->error('数据不可为空');
}
// 存储logo图
if (!empty ($_FILES ['logo'] ['name'])) { // 判断文件是否为空
$logo_file = $_FILES ['logo'] ['tmp_name'];
// 重设置文件名
// $logofilename = 'logo' . substr($_FILES ['logo'] ['name'], stripos($_FILES ['logo'] ['name'], '.'));
$logofilename = 'logo.png';
$logopath = 'img/' . $logofilename; // 设置移动路径
move_uploaded_file($logo_file, $logopath);
}
// 存储海报底图
if (!empty ($_FILES ['posters'] ['name'])) { // 判断文件是否为空
$posters_file = $_FILES ['posters'] ['tmp_name'];
// 重设置文件名
// $postersfilename = 'canvas' . substr($_FILES ['posters'] ['name'], stripos($_FILES ['posters'] ['name'], '.'));
$postersfilename = 'canvas.png';
$posterspath = 'img/' . $postersfilename; // 设置移动路径
move_uploaded_file($posters_file, $posterspath);
}
if (!empty ($_FILES ['url'] ['name'])) { // 判断文件是否为空
$tmp_file = $_FILES ['url'] ['tmp_name'];
// 判断文件类型
$file_types = explode(".", $_FILES ['url'] ['name']);
$file_type = $file_types [count($file_types) - 1];
// 判别是不是.xls文件,判别是不是excel文件
if (strtolower($file_type) != "xls" && strtolower($file_type) != "xlsx" && strtolower($file_type) != "csv") {
$this->error('不是Excel文件,重新上传', '/index/index/index');
}
// 重设置文件名
$filename = time() . substr($_FILES ['url'] ['name'], stripos($_FILES ['url'] ['name'], '.'));
$path = 'excel/' . $filename; // 设置移动路径
move_uploaded_file($tmp_file, $path);
if ($file_type == 'xls') {
$type = 'Excel5'; // 后缀如果是 xls 的话用E xcel5 是 xlsx 用 Excel2007
} elseif ($file_type == 'xlsx') {
$type = 'Excel2007'; // 后缀如果是 xls 的话用E xcel5 是 xlsx 用 Excel2007
} elseif ($file_type == 'csv') {
$type = 'CSV';
}
$xlsReader = \PHPExcel_IOFactory::createReader($type);
$xlsReader->setReadDataOnly(true);
$xlsReader->setLoadSheetsOnly(true);
$Sheets = $xlsReader->load($path);
// 开始读取上传到服务器中的Excel文件,返回一个二维数组
$dataArray = $Sheets->getSheet(0)->toArray();
unset($dataArray['0']);
foreach ($dataArray as $k => $v) {
$dataArray[$k] = $v['3'];
}
// 调用方法生成海报
$fileList = $this->generatePoster($dataArray, $sequence, $name, $date);
// 删除二维码
@unlink('Qr_code.png');
// 删除Logo二维码
@unlink('Logo_qr_code.png');
/***** 多文件压缩开始 *****/
// 生成的压缩包所在的位置路径
$filename = "alg/" . $name . '-' . $date . ".zip";
// 声明ZipArchive类
$zip = new \ZipArchive();
// 打开压缩包,没有则创建
$zip->open($filename, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
foreach ($fileList as $file) {
// 向压缩包中添加文件
$zip->addFile($file, basename($file));
}
// 关闭压缩包
$zip->close();
/***** 多文件压缩结束 *****/
// 删除上传的文件
@unlink($_SERVER['DOCUMENT_ROOT'] . '/' . pathinfo($path)['dirname'] . '/' . pathinfo($path)['basename']);
}
// 设置需要删除的文件夹
$path = $_SERVER['DOCUMENT_ROOT'] . '/' . pathinfo('poster/' . $date)['dirname'] . '/' . pathinfo('poster/' . $date)['basename'];
// 删除文件夹及子文件
if (is_dir($path)) {
// 遍历一个文件夹所有文件并返回数组
$poster_arr = scandir($path);
foreach ($poster_arr as $val) {
//排除目录中的.和..
if ($val != "." && $val != "..") {
//如果是目录则递归子目录,继续操作
if (is_dir($path . '/' . $val)) {
//子目录中操作删除文件夹和文件
deldir($path . '/' . $val . '/');
//目录清空后删除空文件夹
@rmdir($path . '/' . $val . '/');
} else {
//如果是文件直接删除
unlink($path . '/' . $val);
}
}
}
@rmdir($path);
}
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . '/' . $filename;
echo "";
echo "";
$this->success('海报生成完毕,正在下载!', 'index/index/index');
}
/**
* 生成二维码 Logo二维码 带Logo二维码海报
* $url 二维码内容
* $sequence // 起始序号
* $name // 上传人
* $date // 日期
*/
public function generatePoster($url, $sequence, $name, $date)
{
header("Content-type: image/png");
// 加载phpqrcode类文件
include('phpqrcode/phpqrcode.php');
// 声明qrcode类
$qrcode = new \QRcode();
$arr = [];
foreach ($url as $value) {
/***** 二维码生成开始 *****/
// 二维码内容
// $value = $url;
// 容错级别
$errorCorrectionLevel = 'H';
// 生成二维码大小
$matrixPointSize = 11;
// 生成二维码图片名(含路径)
$filename = 'Qr_code.png';
// 生成二维码
$qrcode->png($value, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
/***** 二维码生成结束 *****/
/***** Logo二维码生成开始 *****/
// 准备好的logo图片
$logo = 'img/logo.png';
// logo图是否存在
if (file_exists($logo)) {
// 目标图象连接资源
$QR = imagecreatefromstring(file_get_contents($filename));
// 源图象连接资源
$logo = imagecreatefromstring(file_get_contents($logo));
// 二维码图片宽度
$QR_width = imagesx($QR);
// 二维码图片高度
// $QR_height = imagesy($QR);
// logo图片宽度
$logo_width = imagesx($logo);
// logo图片高度
$logo_height = imagesy($logo);
// 组合之后logo的宽度(占二维码的1/5)
$logo_qr_width = $QR_width / 4;
// logo的宽度缩放比(本身宽度/组合后的宽度)
$scale = $logo_width / $logo_qr_width;
// 组合之后logo的高度
$logo_qr_height = $logo_height / $scale;
// 组合之后logo左上角所在坐标点
$from_width = ($QR_width - $logo_qr_width) / 2;
// 重新组合图片并调整大小
// imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
}
// 输出图片 (这里注意是本地目录)
imagepng($QR, 'Logo_qr_code.png');
// 销毁一图像
imagedestroy($QR);
imagedestroy($logo);
// 删除二维码
// @unlink('Qr_code.png');
/***** Logo二维码生成结束 *****/
/***** 海报和Logo二维码合成开始 *****/
// 海报底图路径
$posters_path = 'img/canvas.png';
// 覆盖的Logo二维码地址
$logo_path = 'Logo_qr_code.png';
//创建图片的实例
$posters = imagecreatefromstring(file_get_contents($posters_path));
$logo = imagecreatefromstring(file_get_contents($logo_path));
// 获取覆盖图图片的宽高
list($posters_w, $logo_h) = getimagesize($logo_path);
// 将覆盖图复制到目标图片上,最后个参数100是设置透明度(100是不透明),这里实现不透明效果
imagecopymerge($posters, $logo, 245, 395, 0, 0, $posters_w, $logo_h, 100);
// 删除Logo二维码
// @unlink('Logo_qr_code.png');
// 判断文件是否存在 不存在则生成
@mkdir('poster/' . $date);
// 根据需要生成相应的图片
imagepng($posters, 'poster/' . $date . '/' . $name . '-' . $date . '-' . $sequence . '.png');
/***** 海报和Logo二维码合成结束 *****/
$arr[] = 'poster/' . $date . '/' . $name . '-' . $date . '-' . $sequence . '.png';
$sequence++;
}
return $arr;
}
}