<?php
 
 class FileUpload{
  
  private $filepath; //设置上传文件的路径
  private $allowtype=array('jpg','jpeg','gif','bmp'); //默认的文件的类型
  private $maxsize=2000000;   //默认文件的大小
  private $israndname=true; //是否使用随机文件名
  private $originName;  //源文件名称
  private $tmpFileName;  //临时文件名
  private $fileType;    //文件类型
  private $fileSize;   //文件的大小
  private $newFileName;  //新文件的名称
  private $errorNum;  //错误号
  private $errorMess=""; //用来提示错误报告
  //用于文件初始化的函数
  function __construct($options=array()){
   foreach($options as $key=>$val){
    $key=strtolower($key);//设置属性名称均为小写
    //get_class_vars(get_class($this))
    //获取当前类的所有的属性
    if(!in_array($key,get_class_vars(get_class($this)))){
     continue; 
    }
    else
    {
     $this->setOption($key,$val);
    }
   }
  }

//定义不同的错误级别
  private function getError(){
   $str="<font color='red'>上传文件{$this->originName}时出错:";

switch($this->errorNum){
    case 4:
     $str.="文件没有被上传";
     break;
    case 3:
     $str.="文件只有部分上传";
     break;
    case 2:
     $str.="上传文件超过了HTML表单中规定的MAX_FILE_SIZE选项的值";
     break;
    case 1:
     $str.="上传文件吵过了php.ini中upload_max_filesize选项的值";
     break;
    case -1:
     $str.="未允许的类型";
     break;
    case -2:
     $str.="上传文件过大,不能超过{$this->maxSize}个字节";
     break;
    case -3:
     $str.="上传失败";
     break;
    case -4:
     $str.="建立存放上传目录失败,请重新指定上传目录";
     break;
    case -5:
     $str.="必须指定上传文件的路径";
     break;
    default:
     $str.="未知的错误";

}

return $str."</font><br/>";
  }

//为成员属性赋值的函数
  private function setOption($key,$val){
   $this->$key=$val;
  }
  //用于检查上传文件的路径
  private function checkFilePath(){
   //如果文件路径为空
   if(empty($this->filepath)){
    $this->setOption('errorNum',-5);
    return false;
   }
   //判断路径是否存在并且是否可写
   if(!file_exists($this->filepath)||!is_writable($this->filepath)){
    //@是错误抑制符  @ 是忽略错误提示,使其错
    //误消息不会显示在程序里
    if(!@mkdir($this->filepath,0755)){
     $this->setOption('errorNum',-4);
     return false;
    }
   }
   return true;
  }

//检查文件大小的函数
  private function checkFileSize(){
   if($this->fileSize>$this->maxsize){
    $this->setOption("errorNum",-2);
    return false;
   }
   else
   {
    return true;
   }
  
  }

//检查上传文件的类型
  private function checkFileType(){
   if(in_array(strtolower($this->fileType),$this->allowtype))
   {
    return true;
   }
   else
   {
    $this->setOption("errorNum",-1);
    return false;
   }
  }
  //上传一个文件
  function uploadFile($fileField){
   $return=true;
   $name=$_FILES[$fileField]["name"]; //post提交的名称
   $tmp_name=$_FILES[$fileField]["tmp_name"];  //上传时的临时文件名
   $size=$_FILES[$fileField]["size"];
   $error=$_FILES[$fileField]["error"];
   if($this->setFiles($name,$tmp_name,$size,$error)){
    if($this->checkFileSize() && $this->checkFileType()){
     $this->setNewFileName();
     if($this->copyFile())
     {
      $return=true;
     }
     else
     {
      $return=false;
     }
    }
    else
    {
     $return=false;
    } 
   }
   else
   {
    $return=false;
   }
   //检查文件的路径是否存在错误
   if(!$this->checkFilePath()){
    $this->errorMess=$this->getError();
    return false;
   }

if(!$return)
   {
    $this->errorMess=$this->getError();
   }
   return $return;
  }
  //设置和$_FILES有关的内容
  private function setFiles($name="",$tmp_name="",$size=0,$error=0){
   $this->setOption("errorNum",$error);
   if($this->errorNum){
    return false;
   }
   $arrstr=explode(".",$name);
   $this->setOption("fileType",strtolower($arrstr[count($arrstr)-1]));
   $this->setOption("originName",$name);
   $this->setOption("tmpFileName",$tmp_name);
   $this->setOption("fileSize",$size);
   return true;
  }

//用于获取上传文件后文件的名称
  function getNewFileName(){
   return $this->newFileName.'上传成功!';
  }

//上传文件失败时,显示错误信息的函数
  function getErrorMsg(){
   return $this->errorMess; 
  }
  private function proRandName(){
   $filename=date("YmdHis").rand(100,999);
   return $filename.".".$this->fileType;
  }

//设置上传后的文件名称
  private function setNewFileName(){
   if($this->israndname){
    $this->setOption('newFileName',$this->proRandName());
   }
   else
   {
    $this->setOption('newFileName',$this->originName);
   }
  }

//拷贝文件
  private function copyFile(){
   if(!$this->errorNum){
    $filepath=rtrim($this->filepath,'/')."/";
    $filepath.=$this->newFileName;
    //将文件拷贝到指定的路径当中
    if(@move_uploaded_file($this->tmpFileName,$filepath)){
     return true;
    }
    else
    {
     $this->setOption('errorNum',-3);
     return false;
    }
   }
  }
 
 
 }

?>

PHP中的一个很好用的文件上传类的更多相关文章

  1. PHP封装一个通用好用的文件上传处理类

    封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...

  2. php 文件上传类,功能相当齐全,留作开发中备用吧。

    收藏一个经典好用的php 文件上传类,功能相当齐全,留作开发中备用吧. 好东西,大家都喜欢,才是真的好,哈哈!!! <?php  /**   * 文件上传类   */  class upload ...

  3. 一个经典的PHP文件上传类

    需求分析如下: (1)支持单个文件上传 (2)支持多个文件上传 (3)可以指定保存位置 可以设置上传文件允许的大小和类型 可以选择重命名和保留原名 <!-- 设计一个经典文件上传类 需求分析 ( ...

  4. 分享一个PHP文件上传类

    该类用于处理文件上传,可以上传一个文件,也可以上传多个文件. 包括的成员属性有: private $path = "./uploads"; //上传文件保存的路径 private ...

  5. Crontab中shell每分钟执行一次HDFS文件上传不执行的解决方案

    一.Crontab -e 加入输出Log */1 * * * * /qiwen_list/upload_to_hdfs.sh > /qiwen_list/mapred.log 2>& ...

  6. 搜藏一个php文件上传类

    <?php /** * 上传文件类 * @param _path : 服务器文件存放路径 * @param _allowType : 允许上传的文件类型和所对应的MIME * @param _f ...

  7. django项目中form表单和ajax的文件上传功能。

    form表单文件上传 路由 # from表单上传 path('formupload/',apply.formupload,name='formupload/'), 方法 # form表单文件上传 de ...

  8. 一个tornado框架下的文件上传案例

    html部分----使用了form表单,注意三要素 method="post"  action="/loaddata" enctype="multip ...

  9. django中处理文件上传文件

    1 template模版文件uploadfile.html 特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype="multi ...

随机推荐

  1. 如何实现select组件的选择输入过滤作用

    实现select组件的选择输入过滤作用的js代码如下: /** *其中//******之间的部分显示的是在没有选择输入过滤功能的代码上加入的功能代码 ** / (function ( $ ) { $. ...

  2. javascript每日一练—运动

    1.弹性运动 运动原理:加速运动+减速运动+摩擦运动: <!doctype html> <html> <head> <meta charset="u ...

  3. PHP判断图片是否存在和jquery中load事件对图片的处理

    在公司的图片服务器中,同一个产品一般会存在对应的大图和缩略图.因此,我们在开发手机端的web网站时,默认使用的是产品图片的缩略图,查询数据库时获取的是缩略图的路径.但是,不知什么原因,时不时的,测试的 ...

  4. codeforces 665D Simple Subset

    题目链接 给一个数列, 让你选出其中的m个数, 使得选出的数中任意两个数之和都为质数, m尽可能的大. 首先, 除了1以外的任意两个相同的数相加结果都不是质数. 然后, 不考虑1的话, 选出的数的个数 ...

  5. 初识C(2)---从printf函数开始

    继承[K&R]的传统,我们的第一个C语言程序也是“Hello, World.”. 书写C语言程序的大前提:C语言中的语法符号必须都是英文字符,即在中文输入法关闭状态下输入的字符. 例 1. H ...

  6. 供应类型与计划分类一致性检查(PO)

    应用 Oracle   Purchasing 层 Level Function 函数名 Funcgtion Name CUXPOIMM 表单名 Form Name CUXPOIMM 说明 Descri ...

  7. fragment、ListFragment使用ListView及自定义Listview等初始化操作

    fragment.ListFragment使用ListView及自定义Listview等初始化操作 1.先说一下 从官方api中说fragment碎片中使用Listview有专门的 ListView碎 ...

  8. umount.nfs device busy day virsh extend diskSpace, attachDisk

    KVM中linux虚拟机的硬盘添加方法 最近虚拟机中运行的东西比较多,很多.而刚启动的时候虚拟机分配的磁盘比较少,随着日志还有平时的上传文件的积累,磁盘空间报警了.网上查了下资料,自己也做了下实验.总 ...

  9. CSS用法简介

    CSS(Cascading Style Sheets层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. 1.基本使用语法   ...

  10. linux查看与开启ssh

    首先通过物理终端进入到linux上,手工检查ssh发现没运行/etc/init.d/sshd statussshd is stopped手工启动服务,发现报告权限错误./etc/init.d/sshd ...