PHP文件操作类(上传,样图,文件夹内容浏览删除)

Posted by linyupark :: 2007,October 9th,20:34 pm

继续写了一个PHP文件相关的处理类,写的不是很周全,大家可以自己修正

<?php
/*
* 文件操作类,create by linyupark,
*/
class File
{
	protected $path; //根目录例如 ./upload

	function __construct($path)
	{
		if(!is_dir($path))
		mkdir($path,0777);
		$this->path = $path;
	}

	/*
	* # 文件上传函数
	* @ input_name 为表单中type为file的name值
	* @ ext_arr 为允许使用的扩展名数组,请用小写,例array('jpg','gif')
	* @ max_size 文件大小,单位b,上限请修改php.ini中的post上限和upload上限
	* @ rand 是否把上传的文件改为随机数,避免相同文件名上传
	* @ sample 如果文件为图象可以给该参数指定宽或高(x,y),比如array(100,'auto')
	*/
	public function upload($input_name,$ext_arr,$max_size,$rand=0,$sample=null)
	{
		//基本错误
		if ($_FILES[$input_name]['error'] > 0)
		{
			switch ($_FILES[$input_name]['error'])
			{
				case 3: return "只上传了部分文件"; break;
				case 4: return "没有文件上传"; break;
				default: return "文件大小超标";
			}
			exit();
		}

		//文件大小
		if($_FILES[$input_name]['size'] > $max_size)
		{
			return "文件大小超标";
			exit();
		}

		//文件类型
		$type = array_shift(explode("/",$_FILES[$input_name]['type']));

		if(!is_dir("{$this->path}/{$type}"))
		mkdir("{$this->path}/{$type}");

		//扩展名
		$file_ext = strtolower(array_pop(explode(".",$_FILES[$input_name]['name'])));

		if(!in_array($file_ext,$ext_arr))
		{
			return "文件扩展名不符合要求";
			exit();
		}

		//文件名
		if($rand==1)
		$file_name = time().rand(1000,9999).".".$file_ext;
		else
		$file_name = strtolower($_FILES[$input_name]['name']);

		//临时文件转移
		if(is_uploaded_file($_FILES[$input_name]['tmp_name']))
		{
			if(!move_uploaded_file($_FILES[$input_name]['tmp_name'],
			"{$this->path}/{$type}/{$file_name}"))
			{
				return "上传的文件移动过程中失败";
				exit();
			}

		}
		else
		{
			return "无法找到上传的临时文件";
			exit();
		}

		//样图
		if($type == "image" && $sample!=null)
		{
			list($width,$height) = getimagesize("{$this->path}/{$type}/{$file_name}");
			list($x,$y) = $sample;
			if($x != "auto") $s_width = $x;
			else $s_width = ($y/$height)*$width;
			if($y != "auto") $s_height = $y;
			else $s_height = ($x/$width)*$height;
			$dst_img = imagecreatetruecolor($s_width,$s_height);
			switch ($file_ext)
			{
				case 'gif':
					$image = imagecreatefromgif("{$this->path}/{$type}/{$file_name}");
					break;
				case 'png':
					$image = imagecreatefrompng("{$this->path}/{$type}/{$file_name}");
					break;
				case 'bmp':
					$image = imagecreatefromwbmp("{$this->path}/{$type}/{$file_name}");
					break;
				default:
					$image = imagecreatefromjpeg("{$this->path}/{$type}/{$file_name}");
			}
			imagecopyresampled($dst_img,$image,0,0,0,0,$s_width,$s_height,$width,$height);
			//统一输出为jpg
			if(!is_dir("{$this->path}/sample"))
			mkdir("{$this->path}/sample");
			$sample_name = array_shift(explode(".",$file_name)).".jpg";
			imagejpeg($dst_img,"{$this->path}/sample/{$sample_name}",100);
		}

		return "上传任务完成";
	}

	/*
	* # 文件浏览功能函数
	* @ url 执行函数的路径
	* @ dir_arg 切换目录的参数变量
	* @ value 切换目录的值,目录名不能为中文
	* @ del_arg 删除参数变量
	*/
	public function browser($url,$dir_arg,$del_arg=null)
	{
		//是否有参数值
		if(!isset($_GET[$dir_arg]))
		$value = $this->path;
		else $value = $_GET[$dir_arg];

		//有删除操作
		if(isset($_GET[$del_arg]))
		{
			if(is_dir($_GET[$del_arg]))
			$this->rmdir($_GET[$del_arg]);
			else unlink($_GET[$del_arg]);
		}

		$dir = dir($value);
		$pre_value = $this->path; //初始父目录
		$str = "<dl>";
		//是否有上一级目录
		if($value!=$this->path)
		{
			$pre_value = explode("/",$value);
			array_pop($pre_value);
			$pre_value = implode("/",$pre_value);
			$str.= "<dt><a href='{$url}?{$dir_arg}={$pre_value}'>父目录</a></dt>";
		}
		while (false!==($unit=$dir->read()))
		{
			if($unit!="." && $unit!="..")
			{
				//是否为目录
				if(is_dir("{$value}/{$unit}"))
				{
					if($del_arg!=null)
					$str.= "<dt><a href='{$url}?{$dir_arg}={$value}/{$unit}'>{$unit}/</a>
						    <a href='{$url}?{$dir_arg}={$pre_value}&{$del_arg}={$value}/{$unit}'>删除</a></dt>";
					else
					$str.= "<dt><a href='{$url}?{$dir_arg}={$value}/{$unit}'>{$unit}/</a></dt>";
				}

				else
				{
					$file = substr($value,1)."/".$unit;
					if($del_arg!=null)
					$str.= "<dd><a href='{$file}'>{$unit}</a>
					        <a href='{$url}?{$dir_arg}={$value}&{$del_arg}={$value}/{$unit}'>删除</a></dd>";
					else
					$str.= "<dd><a href='{$file}'>{$unit}</a></dd>";
				}
			}
		}
		$dir->close();
		$str.= "</dl>";
		return $str;
	}

	/*
	* 内部函数,删除目录以及里面的所有文件
	*/
	protected function rmdir($path)
	{
		$dir = dir($path);
		while (false!==($unit=$dir->read()))
		{
			if($unit!="."&&$unit!="..")
			{
				if(is_dir($path."/".$unit))
				{
					$this->rmdir($path."/".$unit);
				}
				else unlink($path."/".$unit);
			}
		}
		$dir->close();
		rmdir($path);
	}
}

?>

Leave a Reply