123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671 |
- <?php
-
- /**
- * @copyright (C)2016-2099 Hnaoyun Inc.
- * @author XingMeng
- * @email hnxsh@foxmail.com
- * @date 2017年8月3日
- * 数据处理函数库
- */
- use core\basic\Config;
-
- // 检测目录是否存在
- function check_dir($path, $create = false)
- {
- if (is_dir($path)) {
- return true;
- } elseif ($create) {
- return create_dir($path);
- }
- }
-
- // 创建目录
- function create_dir($path)
- {
- if (! file_exists($path)) {
- if (mkdir($path, 0777, true)) {
- return true;
- }
- }
- return false;
- }
-
- // 检查文件是否存在
- function check_file($path, $create = false, $content = null)
- {
- if (file_exists($path)) {
- return true;
- } elseif ($create) {
- return create_file($path, $content);
- }
- }
-
- // 创建文件
- function create_file($path, $content = null, $over = false)
- {
- if (file_exists($path) && ! $over) {
- return false;
- } elseif (file_exists($path)) {
- @unlink($path);
- }
- check_dir(dirname($path), true);
- $handle = fopen($path, 'w') or error('创建文件失败,请检查目录权限!');
- fwrite($handle, $content);
- return fclose($handle);
- }
-
- // 目录文件夹列表
- function dir_list($path)
- {
- $list = array();
- if (! is_dir($path) || ! $filename = scandir($path)) {
- return $list;
- }
- $files = count($filename);
- for ($i = 0; $i < $files; $i ++) {
- $dir = $path . '/' . $filename[$i];
- if (is_dir($dir) && $filename[$i] != '.' && $filename[$i] != '..') {
- $list[] = $filename[$i];
- }
- }
- return $list;
- }
-
- // 目录文件列表
- function file_list($path)
- {
- $list = array();
- if (! is_dir($path) || ! $filename = scandir($path)) {
- return $list;
- }
- $files = count($filename);
- for ($i = 0; $i < $files; $i ++) {
- $dir = $path . '/' . $filename[$i];
- if (is_file($dir)) {
- $list[] = $filename[$i];
- }
- }
- return $list;
- }
-
- // 目录下文件及文件夹列表
- function path_list($path)
- {
- $list = array();
- if (! is_dir($path) || ! $filename = scandir($path)) {
- return $list;
- }
- $files = count($filename);
- for ($i = 0; $i < $files; $i ++) {
- $dir = $path . '/' . $filename[$i];
- if (is_file($dir) || (is_dir($dir) && $filename[$i] != '.' && $filename[$i] != '..')) {
- $list[] = $filename[$i];
- }
- }
- return $list;
- }
-
- //获取目录和子目录下所有文件
- function get_dir($path): array
- {
- $files = array();
- if (is_dir($path)) {
- if ($handle = opendir($path)) {
- while (($file = readdir($handle)) !== false) {
- if ($file != "." && $file != ".." && $file != "file") {
- if (is_dir($path . "/" . $file)) {
- $files[$file] = get_dir($path . "/" . $file);
- } else {
- $files[] = $path . "/" . $file;
- }
- }
- }
- closedir($handle);
- return $files;
- }
- }
- return $files;
- }
-
- /**
- * 删除目录及目录下所有文件或删除指定文件
- *
- * @param str $path
- * 待删除目录路径
- * @param int $delDir
- * 是否删除目录,true删除目录,false则只删除文件保留目录
- * @return bool 返回删除状态
- */
- function path_delete($path, $delDir = false, $exFile = array())
- {
- $result = true; // 对于空目录直接返回true状态
- if (! file_exists($path)) {
- return $result;
- }
- if (is_dir($path)) {
- if (! ! $dirs = scandir($path)) {
- foreach ($dirs as $value) {
- if ($value != "." && $value != ".." && ! in_array($value, $exFile)) {
- $dir = $path . '/' . $value;
- $result = is_dir($dir) ? path_delete($dir, $delDir, $exFile) : unlink($dir);
- }
- }
- if ($result && $delDir) {
- return rmdir($path);
- } else {
- return $result;
- }
- } else {
- return false;
- }
- } else {
- return unlink($path);
- }
- }
-
- // 拷贝文件夹
- function dir_copy($src, $des, $son = 1)
- {
- if (! is_dir($src)) {
- return false;
- }
-
- if (! is_dir($des)) {
- create_dir($des);
- }
-
- $handle = dir($src);
- while (! ! $path = $handle->read()) {
- if (($path != ".") && ($path != "..")) {
- if (is_dir($src . "/" . $path)) {
- if ($son)
- dir_copy($src . "/" . $path, $des . "/" . $path, $son);
- } else {
- copy($src . "/" . $path, $des . "/" . $path);
- }
- }
- }
- return true;
- }
-
- // 判断文件是否是图片
- function is_image($path)
- {
- $types = '.gif|.jpeg|.png|.bmp'; // 定义检查的图片类型
- if (file_exists($path)) {
- $info = getimagesize($path);
- $ext = image_type_to_extension($info['2']);
- if (stripos($types, $ext) !== false)
- return true;
- }
- return false;
- }
-
- /**
- * 文件上传
- *
- * @param string $input_name表单名称
- * @param string $file_ext允许的扩展名
- * @param number $max_width最大宽度
- * @param number $max_height最大高度
- * @return string 返回成功上传文件的路径数组
- */
- function upload($input_name, $file_ext = null, $max_width = null, $max_height = null, $watermark = false)
- {
- // 未选择文件返回空
- if (! isset($_FILES[$input_name])) {
- return '文件超过PHP环境允许的大小!';
- } else {
- $files = $_FILES[$input_name];
- }
-
- // 定义允许上传的扩展
- if (! $file_ext) {
- $array_ext_allow = Config::get('upload.format', true);
- } else {
- $array_ext_allow = explode(',', $file_ext);
- }
-
- // 未直接传递函数参数,且具有地址参数,则打水印
- if (! $watermark && get('watermark', 'int')) {
- $watermark = true;
- }
-
- $array_save_file = array();
- if (is_array($files['tmp_name'])) { // 多文件情况
- $file_count = count($files['tmp_name']);
- for ($i = 0; $i < $file_count; $i ++) {
- if (! $files['error'][$i]) {
- $upfile = handle_upload($files['name'][$i], $files['tmp_name'][$i], $array_ext_allow, $max_width, $max_height, $watermark);
- if (strrpos($upfile, '/') > 0) {
- $array_save_file[] = $upfile;
- } else {
- $err = $upfile;
- }
- } else {
- $err = '错误代码' . $files['error'][$i];
- }
- }
- } else { // 单文件情况
- if (! $files['error']) {
- $upfile = handle_upload($files['name'], $files['tmp_name'], $array_ext_allow, $max_width, $max_height, $watermark);
- if (strrpos($upfile, '/') > 0) {
- $array_save_file[] = $upfile;
- } else {
- $err = $upfile;
- }
- } else {
- $err = '错误代码' . $files['error'];
- }
- }
- if (isset($err)) {
- return $err;
- } else {
- return $array_save_file;
- }
- }
-
- // 处理并移动上传文件
- function handle_upload($file, $temp, $array_ext_allow, $max_width, $max_height, $watermark)
- {
- // 定义主存储路径
- $save_path = DOC_PATH . STATIC_DIR . '/upload';
-
- $file = explode('.', $file); // 分离文件名及扩展
- $file_ext = strtolower(end($file)); // 获取扩展
-
- if (! in_array($file_ext, $array_ext_allow)) {
- return $file_ext . '格式的文件不允许上传!';
- }
-
- // 文件扩展黑名单
- $black = array(
- 'php',
- 'jsp',
- 'asp',
- 'vb',
- 'exe',
- 'sh',
- 'cmd',
- 'bat',
- 'vbs',
- 'phtml',
- 'class',
- 'php2',
- 'php3',
- 'php4',
- 'php5'
- );
-
- if (in_array($file_ext, $black)) {
- return $file_ext . '格式的文件不允许上传!';
- }
-
- $image = array(
- 'png',
- 'jpg',
- 'gif',
- 'bmp'
- );
- $file = array(
- 'ppt',
- 'pptx',
- 'xls',
- 'xlsx',
- 'doc',
- 'docx',
- 'pdf',
- 'txt'
- );
- if (in_array($file_ext, $image)) {
- $file_type = 'image';
- } elseif (in_array($file_ext, $file)) {
- $file_type = 'file';
- } else {
- $file_type = 'other';
- }
-
- // 检查文件存储路径
- if (! check_dir($save_path . '/' . $file_type . '/' . date('Ymd'), true)) {
- return '存储目录创建失败!';
- }
- $file_path = $save_path . '/' . $file_type . '/' . date('Ymd') . '/' . time() . mt_rand(100000, 999999) . '.' . $file_ext;
- if (! move_uploaded_file($temp, $file_path)) { // 从缓存中转存
- return '从缓存中转存失败!';
- }
- $save_file = str_replace(ROOT_PATH, '', $file_path); // 获取文件站点路径
-
- // 如果是图片
- if (is_image($file_path)) {
- // 进行等比例缩放
- if (($reset = resize_img($file_path, $file_path, $max_width, $max_height)) !== true) {
- return $reset;
- }
- // 图片打水印
- if ($watermark) {
- watermark_img($file_path);
- }
- }
- return $save_file;
- }
-
- /**
- * *
- * 等比缩放图片
- *
- * @param string $src_image源图片路径
- * @param string $out_image输出图像路径
- * @param number $max_width最大宽
- * @param number $max_height最大高
- * @param number $img_quality图片质量
- * @return boolean 返回是否成功
- */
- function resize_img($src_image, $out_image = null, $max_width = null, $max_height = null, $img_quality = 90)
- {
- // 输出地址
- if (! $out_image)
- $out_image = $src_image;
-
- // 读取配置文件设置
- if (! $max_width)
- $max_width = Config::get('upload.max_width') ?: 999999999;
- if (! $max_height)
- $max_height = Config::get('upload.max_height') ?: 999999999;
-
- // 获取图片属性
- list ($width, $height, $type, $attr) = getimagesize($src_image);
-
- // 检查输出目录
- check_dir(dirname($out_image), true);
-
- // 无需缩放的图片
- if ($width <= $max_width && $height <= $max_height) {
- if ($src_image != $out_image) { // 存储地址不一致时进行拷贝
- if (! copy($src_image, $out_image)) {
- return '缩放图片时拷贝到目的地址失败!';
- }
- }
- return true;
- }
-
- // 求缩放比例
- if ($max_width && $max_height) {
- $scale = min($max_width / $width, $max_height / $height);
- } elseif ($max_width) {
- $scale = $max_width / $width;
- } elseif ($max_height) {
- $scale = $max_height / $height;
- }
-
- if ($scale < 1) {
- switch ($type) {
- case 1:
- $img = imagecreatefromgif($src_image);
- break;
- case 2:
- $img = imagecreatefromjpeg($src_image);
- break;
- case 3:
- $img = imagecreatefrompng($src_image);
- break;
- }
-
- $new_width = floor($scale * $width);
- $new_height = floor($scale * $height);
- $new_img = imagecreatetruecolor($new_width, $new_height); // 创建画布
-
- // 创建透明画布,避免黑色
- if ($type == 1 || $type == 3) {
- $color = imagecolorallocate($new_img, 255, 255, 255);
- imagefill($new_img, 0, 0, $color);
- imagecolortransparent($new_img, $color);
- }
- imagecopyresized($new_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
-
- switch ($type) {
- case 1:
- imagegif($new_img, $out_image, $img_quality);
- break;
- case 2:
- imagejpeg($new_img, $out_image, $img_quality);
- break;
- case 3:
- imagepng($new_img, $out_image, $img_quality / 10); // $quality参数取值范围0-99 在php 5.1.2之后变更为0-9
- break;
- default:
- imagejpeg($new_img, $out_image, $img_quality);
- }
- imagedestroy($new_img);
- imagedestroy($img);
- }
- return true;
- }
-
- // 剪切图片
- function cut_img($src_image, $out_image = null, $new_width = null, $new_height = null, $img_quality = 90)
- {
- // 输出地址
- if (! $out_image)
- $out_image = $src_image;
-
- // 读取配置文件设置
- if (! $new_width && ! $new_height)
- return;
-
- // 获取图片属性
- list ($width, $height, $type, $attr) = getimagesize($src_image);
- switch ($type) {
- case 1:
- $img = imagecreatefromgif($src_image);
- break;
- case 2:
- $img = imagecreatefromjpeg($src_image);
- break;
- case 3:
- $img = imagecreatefrompng($src_image);
- break;
- }
-
- // 不限定是等比例缩放
- if (! $new_width) {
- $new_width = floor($width * ($new_height / $height));
- }
- if (! $new_height) {
- $new_height = floor($height * ($new_width / $width));
- }
-
- // 计算裁剪是变大缩小方式
- if ($width >= $new_width && $height >= $new_height) { // 长宽均满足
- $cut_width = $new_width;
- $cut_height = $new_height;
- } else { // 有一边不满足
- $scale1 = $width / $new_width;
- $scale2 = $height / $new_height;
- if ($scale1 < $scale2) { // 变化越多的一边取全值,其余一边等比例缩放
- $cut_width = $width;
- $cut_height = floor($height * ($width / $new_width));
- } else {
- $cut_width = floor($new_width * ($height / $new_height));
- $cut_height = $height;
- }
- }
-
- // 创建画布
- $new_img = imagecreatetruecolor($new_width, $new_height);
-
- // 创建透明画布,避免黑色
- if ($type == 1 || $type == 3) {
- $color = imagecolorallocate($new_img, 255, 255, 255);
- imagefill($new_img, 0, 0, $color);
- imagecolortransparent($new_img, $color);
- }
-
- imagecopyresized($new_img, $img, 0, 0, 0, 0, $new_width, $new_height, $cut_width, $cut_height);
- check_dir(dirname($out_image), true); // 检查输出目录
-
- switch ($type) {
- case 1:
- imagegif($new_img, $out_image, $img_quality);
- break;
- case 2:
- imagejpeg($new_img, $out_image, $img_quality);
- break;
- case 3:
- imagepng($new_img, $out_image, $img_quality / 10); // $quality参数取值范围0-99 在php 5.1.2之后变更为0-9
- break;
- default:
- imagejpeg($new_img, $out_image, $img_quality);
- }
- imagedestroy($new_img);
- imagedestroy($img);
- return true;
- }
-
- // 图片水印
- function watermark_img($src_image, $out_image = null, $position = null, $watermark_image = null, $watermark_text = '', $watermark_text_size = null, $watermark_text_color = null)
- {
- if (! Config::get('watermark_open')) {
- return;
- }
-
- // 输出地址
- if (! $out_image)
- $out_image = $src_image;
-
- // 如果不存在文字及图片则直接返回
- if (! $watermark_text) {
- $watermark_text = Config::get('watermark_text') ?: 'PbootCMS';
- }
- $watermark_image = $watermark_image ?: Config::get('watermark_pic');
- if (! $watermark_text && ! $watermark_image) {
- return;
- }
-
- // 获取图片属性
- list ($width1, $height1, $type1, $attr1) = getimagesize($src_image);
- switch ($type1) {
- case 1:
- $img1 = imagecreatefromgif($src_image);
- break;
- case 2:
- $img1 = imagecreatefromjpeg($src_image);
- break;
- case 3:
- $img1 = imagecreatefrompng($src_image);
- break;
- }
-
- if ($watermark_image) {
- $watermark_image = ROOT_PATH . $watermark_image;
- // 获取水印图片
- list ($width2, $height2, $type2, $attr2) = getimagesize($watermark_image);
- switch ($type2) {
- case 1:
- $img2 = imagecreatefromgif($watermark_image);
- break;
- case 2:
- $img2 = imagecreatefromjpeg($watermark_image);
- break;
- case 3:
- $img2 = imagecreatefrompng($watermark_image);
- break;
- }
- } else {
- if (! $watermark_text_size) {
- $watermark_text_size = Config::get('watermark_text_size') ?: 16;
- }
- if (! $watermark_text_color) {
- $watermark_text_color = Config::get('watermark_text_color') ?: '100,100,100';
- }
- $colors = explode(',', $watermark_text_color);
-
- if (Config::get('watermark_text_font')) {
- $font = ROOT_PATH . Config::get('watermark_text_font');
- } else {
- return;
- }
-
- // 手动创建水印图像
- $fontsize = $watermark_text_size;
- $width2 = mb_strlen($watermark_text, 'UTF-8') * ($fontsize + 10) + 20;
- $height2 = $fontsize + 10;
- $img2 = imagecreatetruecolor($width2, $height2);
- $color = imagecolorallocate($img2, 255, 255, 255);
- imagefill($img2, 0, 0, $color);
- imagecolortransparent($img2, $color); // 创建透明图
- $textcolor = imagecolorallocate($img2, $colors[0], $colors[1], $colors[2]);
- imagettftext($img2, $fontsize, 0, 5, $fontsize + 5, $textcolor, $font, $watermark_text);
- }
-
- // 现对图片太大时,自动缩放水印
- if ($width1 < $width2 * 3 || $height1 < $height2) {
- $scale = min(($width1 / 3) / $width2, ($height1 / 2) / $height2); // 求缩放比例
- $new_width = floor($scale * $width2);
- $new_height = floor($scale * $height2);
- } else {
- $new_width = $width2;
- $new_height = $height2;
- }
-
- // 水印位置
- if (! $position) {
- $position = Config::get('watermark_position') ?: 4;
- }
- switch ($position) {
- case '1':
- $x = 15;
- $y = 15;
- break;
- case '2':
- $x = $width1 - $new_width - 15;
- $y = 20;
- break;
- case '3':
- $x = 20;
- $y = $height1 - $new_height - 15;
- break;
- case '5':
- $x = ($width1 - $new_width) / 2;
- $y = ($height1 - $new_height) / 2;
- break;
- default:
- $x = $width1 - $new_width - 15;
- $y = $height1 - $new_height - 15;
- break;
- }
-
- // 创建透明画布,避免黑色
- if ($type1 == 1 || $type1 == 3) {
- $out = imagecreatetruecolor($width1, $height1);
- $color = imagecolorallocate($out, 255, 255, 255);
- imagefill($out, 0, 0, $color);
- imagecolortransparent($out, $color);
- imagecopy($out, $img1, 0, 0, 0, 0, $width1, $height1);
- } else {
- $out = $img1;
- }
-
- // 打上水印
- imagecopyresized($out, $img2, $x, $y - 10, 0, 0, $new_width, $new_height, $width2, $height2);
- check_dir(dirname($out_image), true); // 检查输出目录
-
- // 输出图片
- switch ($type1) {
- case 1:
- imagegif($out, $out_image, 90);
- break;
- case 2:
- imagejpeg($out, $out_image, 90);
- break;
- case 3:
- imagepng($out, $out_image, 90 / 10); // $quality参数取值范围0-99 在php 5.1.2之后变更为0-9
- break;
- default:
- imagejpeg($out, $out_image, 90);
- }
- imagedestroy($img1);
- imagedestroy($img2);
- return true;
- }
-
|