一个非常实用的php文件上传类

其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。

下面的代码放在一个名为UploadFile.class.PHP文件

PHP;"> /** * 构造函数,初始化 * @param string $rand_name 是否随机命名 * @param string $save_path 文件保存路径 * @param string $allow_type 允许上传类型 $allow_type可为数组 array('jpg','jpeg','png','gif'); $allow_type可为字符串 'jpg|jpeg|png|gif';中间可用' ',',';','|'分割 */ public function __construct($rand_name=true,$save_path='./upload/',$allow_type=''){ $this->rand_name = $rand_name; $this->save_path = $save_path; $this->allow_type = $this->get_allow_type($allow_type); } /** * <a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a> * 在<a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>前要做的工作 * (1) <a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>所有信息 * (2) 判断<a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>是否合法 * (3) 设置<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>存放路径 * (4) 是否<a href="https://www.f2er.com/tag/zhongmingming/" target="_blank" class="keywords">重命名</a> * (5) <a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>完成 * @param array $file <a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a> * $file须包含$file['name'],$file['size'],$file['error'],$file['tmp_name'] */ public function upload_file($file){ //$this->file = $file; $this->file_name = $file['name']; $this->file_size = $file['size']; $this->error = $file['error']; $this->file_tmp_name = $file['tmp_name']; $this->ext = $this->get_file_type($this->file_name); switch($this->error){ case 0: $this->msg = ''; break; case 1: $this->msg = '超出了<a href="https://www.f2er.com/tag/PHP/" target="_blank" class="keywords">PHP</a>.ini中<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>大小'; break; case 2: $this->msg = '超出了MAX_FILE_SIZE的<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>大小'; break; case 3: $this->msg = '<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>被部分<a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>'; break; case 4: $this->msg = '没有<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a><a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>'; break; case 5: $this->msg = '<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>大小为0'; break; default: $this->msg = '<a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>失败'; break; } if($this->error==0 && is_uploaded_file($this->file_tmp_name)){ //检测<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>类型 if(in_array($this->ext,$this->allow_type)==false){ $this->msg = '<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>类型不正确'; return false; } //检测<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>大小 if($this->file_size > $this->max_size){ $this->msg = '<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>过大'; return false; } } $this->set_file_name(); $this->uploaded = $this->save_path.$this->new_name; if(move_uploaded_file($this->file_tmp_name,$this->uploaded)){ $this->msg = '<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a><a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>成功'; return true; }else{ $this->msg = '<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a><a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>失败'; return false; } } /** * 设置<a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a>后的<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>名 * 当前的毫秒数和原扩展名为新<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>名 */ public function set_file_name(){ if($this->rand_name==true){ $a = explode(' ',microtime()); $t = $a[1].($a[0]*1000000); $this->new_name = $t.'.'.($this->ext); }else{ $this->new_name = $this->file_name; } } /** * <a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>类型 * @param string $filename 目标<a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a> * @return string $ext <a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>类型 */ public function get_file_type($filename){ $ext = pathinfo($filename,PATHINFO_EXTENSION); return $ext; } /** * <a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>可<a href="https://www.f2er.com/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="https://www.f2er.com/tag/wenjian/" target="_blank" class="keywords">文件</a>的类型 */ public function get_allow_type($allow_type){ $s = array(); if(is_array($allow_type)){ foreach($allow_type as $value){ $s[] = $value; } }else{ $s = preg_split("/[\s,|;]+/",$allow_type); } return $s; } //<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="https://www.f2er.com/tag/cuowu/" target="_blank" class="keywords">错误</a>信息 public function get_msg(){ return $this->msg; }

}
?>

其实上面的代码中还有一个可以改进的地方,就是将那些以‘file_'开头的变量缩写为一个$file数组,这样感觉更好一些。

下面我们来测试一下上面的代码。我在一个名为upfile.PHP文件写测试代码,同时将UploadFile.class.PHP放在同一个路径下。

upfile 0){ echo "Error: " . $_FILES["file"]["error"] . "
"; }else{ $file = $_FILES['file'];
    $upload = new UploadFile(true,'./images/',array('jpg','png'));
    $upload->upload_file($file);
    echo $upload->get_msg();
  }
}else{

?>
<form action="" method='post' enctype="multipart/form-data">

在上面的代码中,我们可以尝试修改第15行的参数,用来判断一下我们写的方法是否正确。

这3个参数的含义分别表示:是否使用系统命名、文件存放的路径(相对)、允许上传文件类型。那么就试试修改这3个参数会发生什么样的变化:(1)把true改为false是否就可以使用它原来的名字了;(2)改下存放路径,看看能不能依然能够上传;(3)试试上传几个不允许的文件,看能不能禁止住,而且关键第三个参数有两种形式,一种是数组,就像示例中一样;还有一种是字符串,用分隔符隔开就行, 'jpg|jpeg|png|gif','jpg jpeg png gif','jpg,jpeg,png,gif'都行。

好的,文件上传类就这样写好了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...