php 文件操作系统封装类 记得收藏哦

24 篇文章 0 订阅

文件操作封装类

class Files {
	// 检测目录是否存在
	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;
	}
	
	/**
	 * 删除目录及目录下所有文件或删除指定文件
	 *
	 * @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;
	}
}

记得收藏哦,后面不好找了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laravel技术社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值