<?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);
}
}
?>
/*
* 文件操作类,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);
}
}
?>