找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1386|回复: 1

[站长互助] 一个实用的php 文件上传类代码

[复制链接]
发表于 2011-8-8 01:02:36 | 显示全部楼层 |阅读模式
这里是来自网络朋友的一个实现的文件上传类代码,我们详细的介绍了每个变量的用处,下面看看吧,有需要可以参考一下。
  1. <?php教程
  2.      /**
  3.       * 文件上传类
  4.       */
  5.      class uploadFile {

  6.       public $max_size = '1000000';//设置上传文件大小
  7.       public $file_name = 'date';//重命名方式代表以时间命名,其他则使用给予的名称
  8.       public $allow_types;//允许上传的文件扩展名,不同文件类型用“|”隔开
  9.       public $errmsg = '';//错误信息
  10.       public $uploaded = '';//上传后的文件名(包括文件路径)
  11.       public $save_path;//上传文件保存路径
  12.       private $files;//提交的等待上传文件
  13.       private $file_type = array();//文件类型
  14.       private $ext = '';//上传文件扩展名

  15.       /**
  16.        * 构造函数,初始化类
  17.        * @access public
  18.        * @param string $file_name 上传后的文件名
  19.        * @param string $save_path 上传的目标文件夹
  20.        */
  21.       public function __construct($save_path = './upload/',$file_name = 'date',$allow_types = '') {
  22.       $this->file_name   = $file_name;//重命名方式代表以时间命名,其他则使用给予的名称
  23.       $this->save_path   = (preg_match('//$/',$save_path)) ? $save_path : $save_path . '/';
  24.       $this->allow_types = $allow_types == '' ? 'jpg|gif|png|zip|rar' : $allow_types;
  25.       }

  26.       /**
  27.        * 上传文件
  28.        * @access public
  29.        * @param $files 等待上传的文件(表单传来的$_FILES[])
  30.        * @return boolean 返回布尔值
  31.        */
  32.      public function upload_file($files) {
  33.       $name = $files['name'];
  34.       $type = $files['type'];
  35.       $size = $files['size'];
  36.       $tmp_name = $files['tmp_name'];
  37.       $error = $files['error'];

  38.       switch ($error) {
  39.        case 0 : $this->errmsg = '';
  40.         break;
  41.        case 1 : $this->errmsg = '超过了php.ini中文件大小';
  42.         break;
  43.        case 2 : $this->errmsg = '超过了MAX_FILE_SIZE 选项指定的文件大小';
  44.         break;
  45.            case 3 : $this->errmsg = '文件只有部分被上传';
  46.         break;
  47.        case 4 : $this->errmsg = '没有文件被上传';
  48.         break;
  49.        case 5 : $this->errmsg = '上传文件大小为0';
  50.         break;
  51.           default : $this->errmsg = '上传文件失败!';
  52.         break;
  53.        }
  54.       if($error == 0 && is_uploaded_file($tmp_name)) {
  55.        //检测文件类型
  56.        if($this->check_file_type($name) == FALSE){
  57.         return FALSE;
  58.        }
  59.        //检测文件大小
  60.        if($size > $this->max_size){
  61.         $this->errmsg = '上传文件<font color=red>'.$name.'</font>太大,最大支持<font color=red>'.ceil($this->max_size/1024).'</font>kb的文件';
  62.         return FALSE;
  63.        }
  64.        $this->set_save_path();//设置文件存放路径
  65.        $new_name = $this->file_name != 'date' ? $this->file_name.'.'.$this->ext : date('YmdHis').'.'.$this->ext;//设置新文件名
  66.        $this->uploaded = $this->save_path.$new_name;//上传后的文件名
  67.        //移动文件
  68.        if(move_uploaded_file($tmp_name,$this->uploaded)){
  69.         $this->errmsg = '文件<font color=red>'.$this->uploaded.'</font>上传成功!';
  70.         return TRUE;
  71.        }else{
  72.         $this->errmsg = '文件<font color=red>'.$this->uploaded.'</font>上传失败!';
  73.         return FALSE;
  74.        }

  75.       }
  76.      }

  77.       /**
  78.        * 检查上传文件类型
  79.        * @access public
  80.        * @param string $filename 等待检查的文件名
  81.        * @return 如果检查通过返回TRUE 未通过则返回FALSE和错误消息
  82.        */
  83.         public function check_file_type($filename){
  84.       $ext = $this->get_file_type($filename);
  85.       $this->ext = $ext;
  86.         $allow_types = explode('|',$this->allow_types);//分割允许上传的文件扩展名为数组
  87.         //echo $ext;
  88.         //检查上传文件扩展名是否在请允许上传的文件扩展名中
  89.         if(in_array($ext,$allow_types)){
  90.          return TRUE;
  91.         }else{
  92.          $this->errmsg = '上传文件<font color=red>'.$filename.'</font>类型错误,只支持上传<font color=red>'.str_replace('|',',',$this->allow_types).'</font>等文件类型!';
  93.          return FALSE;
  94.         }
  95.         }

  96.         /**
  97.          * 取得文件类型
  98.          * @access public
  99.          * @param string $filename 要取得文件类型的目标文件名
  100.          * @return string 文件类型
  101.          */
  102.         public function get_file_type($filename){
  103.          $info = pathinfo($filename);
  104.          $ext = $info['extension'];
  105.          return $ext;
  106.         }

  107.      /**
  108.       * 设置文件上传后的保存路径
  109.       */
  110.      public function set_save_path(){
  111.       $this->save_path = (preg_match('//$/',$this->save_path)) ? $this->save_path : $this->save_path . '/';
  112.       if(!is_dir($this->save_path)){
  113.        //如果目录不存在,创建目录
  114.        $this->set_dir();
  115.       }
  116.      }


  117.      /**
  118.       * 创建目录
  119.       * @access public
  120.       * @param string $dir 要创建目录的路径
  121.       * @return boolean 失败时返回错误消息和FALSE
  122.       */
  123.      public function set_dir($dir = null){
  124.       //检查路径是否存在
  125.       if(!$dir){
  126.        $dir = $this->save_path;
  127.       }
  128.       if(is_dir($dir)){
  129.        $this->errmsg = '需要创建的文件夹已经存在!';
  130.       }
  131.       $dir = explode('/', $dir);
  132.       foreach($dir as $v){
  133.        if($v){
  134.         $d .= $v . '/';
  135.         if(!is_dir($d)){
  136.          $state = mkdir($d, 0777);
  137.          if(!$state)
  138.           $this->errmsg = '在创建目录<font color=red>' . $d . '时出错!';
  139.         }
  140.        }
  141.       }
  142.       return true;
  143.      }
  144.      }

  145.     /*************************************************
  146.      * 图片处理类
  147.      *
  148.      * 可以对图片进行生成缩略图,打水印等操作
  149.      * 本类默认编码为UTF8 如果要在GBK下使用请将img_mark方法中打中文字符串水印iconv注释去掉
  150.      *
  151.      * 由于UTF8汉字和英文字母大小(像素)不好确定,在中英文混合出现太多时可能会出现字符串偏左
  152.      * 或偏右,请根据项目环境对get_mark_xy方法中的$strc_w = strlen($this->mark_str)*7+5进
  153.      * 行调整
  154.      * 需要GD库支持,为更好使用本类推荐使用GD库2.0+
  155.      *
  156.      * @author kickflip@php100 QQ263340607
  157.      *************************************************/

  158.      class uploadImg extends uploadFile {

  159.      public $mark_str = 'kickflip@php100';  //水印字符串
  160.      public $str_r = 0; //字符串颜色R
  161.      public $str_g = 0; //字符串颜色G
  162.      public $str_b = 0; //字符串颜色B
  163.      public $mark_ttf = './upload/SIMSUN.TTC'; //水印文字字体文件(包含路径)
  164.      public $mark_logo = './upload/logo.png';    //水印图片
  165.      public $resize_h;//生成缩略图高
  166.      public $resize_w;//生成缩略图宽
  167.      public $source_img;//源图片文件
  168.      public $dst_path = './upload/';//缩略图文件存放目录,不填则为源图片存放目录

  169.      /**
  170.       * 生成缩略图 生成后的图
  171.       * @access public
  172.       * @param integer $w 缩小后图片的宽(px)
  173.       * @param integer $h 缩小后图片的高(px)
  174.       * @param string $source_img 源图片(路径+文件名)
  175.       */
  176.      public function img_resized($w,$h,$source_img = NULL){
  177.       $source_img = $source_img == NULL ? $this->uploaded : $source_img;//取得源文件的地址,如果为空则默认为上次上传的图片
  178.       if(!is_file($source_img)) { //检查源图片是否存在
  179.        $this->errmsg = '文件'.$source_img.'不存在';
  180.        return FALSE;
  181.       }
  182.       $this->source_img = $source_img;
  183.       $img_info = getimagesize($source_img);
  184.       $source = $this->img_create($source_img); //创建源图片
  185.       $this->resize_w = $w;
  186.       $this->resize_h = $h;
  187.       $thumb = imagecreatetruecolor($w,$h);
  188.       imagecopyresized($thumb,$source,0,0,0,0,$w,$h,$img_info[0],$img_info[1]);//生成缩略图片
  189.       $dst_path = $this->dst_path == '' ? $this->save_path : $this->dst_path; //取得目标文件夹路径
  190.       $dst_path = (preg_match('//$/',$dst_path)) ? $dst_path : $dst_path . '/';//将目标文件夹后加上/
  191.       if(!is_dir($dst_path)) $this->set_dir($dst_path); //如果不存在目标文件夹则创建
  192.       $dst_name = $this->set_newname($source_img);
  193.       $this->img_output($thumb,$dst_name);//输出图片
  194.       imagedestroy($source);
  195.       imagedestroy($thumb);
  196.      }

  197.      /**
  198.       *打水印
  199.       *@access public
  200.       *@param string $source_img 源图片路径+文件名
  201.       *@param integer $mark_type 水印类型(1为英文字符串,2为中文字符串,3为图片logo,默认为英文字符串)
  202.       *@param integer $mark_postion 水印位置(1为左下角,2为右下角,3为左上角,4为右上角,默认为右下角);
  203.       *@return 打上水印的图片
  204.       */
  205.      public function img_mark($source_img = NULL,$mark_type = 1,$mark_postion = 2) {
  206.       $source_img = $source_img == NULL ? $this->uploaded : $source_img;//取得源文件的地址,如果为空则默认为上次上传的图片
  207.       if(!is_file($source_img)) { //检查源图片是否存在
  208.        $this->errmsg = '文件'.$source_img.'不存在';
  209.        return FALSE;
  210.       }
  211.       $this->source_img = $source_img;
  212.       $img_info = getimagesize($source_img);
  213.       $source = $this->img_create($source_img); //创建源图片
  214.       $mark_xy = $this->get_mark_xy($mark_postion);//取得水印位置
  215.       $mark_color = imagecolorallocate($source,$this->str_r,$this->str_g,$this->str_b);

  216.       switch($mark_type) {

  217.        case 1 : //加英文字符串水印
  218.        $str = $this->mark_str;
  219.        imagestring($source,5,$mark_xy[0],$mark_xy[1],$str,$mark_color);
  220.        $this->img_output($source,$source_img);
  221.        break;

  222.                 case 2 : //加中文字符串水印
  223.                 if(!is_file($this->mark_ttf)) { //检查字体文件是否存在
  224.         $this->errmsg = '打水印失败:字体文件'.$this->mark_ttf.'不存在!';
  225.        return FALSE;
  226.        }
  227.        $str = $this->mark_str;
  228.        //$str = iconv('gbk','utf-8',$str);//转换字符编码 如果使用GBK编码请去掉此行注释
  229.        imagettftext($source,12,0,$mark_xy[2],$mark_xy[3],$mark_color,$this->mark_ttf,$str);
  230.        $this->img_output($source,$source_img);
  231.        break;

  232.        case 3 : //加图片水印
  233.        if(is_file($this->mark_logo)){  //如果存在水印logo的图片则取得logo图片的基本信息,不存在则退出
  234.         $logo_info = getimagesize($this->mark_logo);
  235.        }else{
  236.         $this->errmsg = '打水印失败:logo文件'.$this->mark_logo.'不存在!';
  237.         return FALSE;
  238.        }

  239.        $logo_info = getimagesize($this->mark_logo);
  240.        if($logo_info[0]>$img_info[0] || $logo_info[1]>$img_info[1]) { //如果源图片小于logo大小则退出
  241.         $this->errmsg = '打水印失败:源图片'.$this->source_img.'比'.$this->mark_logo.'小!';
  242.         return FALSE;
  243.        }

  244.        $logo = $this->img_create($this->mark_logo);
  245.        imagecopy ( $source, $logo, $mark_xy[4], $mark_xy[5], 0, 0, $logo_info[0], $logo_info[1]);
  246.        $this->img_output($source,$source_img);
  247.        break;

  248.        default: //其它则为文字图片
  249.        $str = $this->mark_str;
  250.        imagestring($source,5,$mark_xy[0],$mark_xy[1],$str,$mark_color);
  251.        $this->img_output($source,$source_img);
  252.        break;
  253.       }
  254.       imagedestroy($source);
  255.      }

  256.      /**
  257.       * 取得水印位置
  258.       * @access private
  259.       * @param integer $mark_postion 水印的位置(1为左下角,2为右下角,3为左上角,4为右上角,其它为右下角)
  260.       * @return array $mark_xy 水印位置的坐标(索引0为英文字符串水印坐标X,索引1为英文字符串水印坐标Y,
  261.       * 索引2为中文字符串水印坐标X,索引3为中文字符串水印坐标Y,索引4为水印图片坐标X,索引5为水印图片坐标Y)
  262.       */
  263.      private function get_mark_xy($mark_postion){
  264.       $img_info = getimagesize($this->source_img);

  265.       $stre_w = strlen($this->mark_str)*9+5 ; //水印英文字符串的长度(px)(5号字的英文字符大小约为9px 为了美观再加5px)
  266.       //(12号字的中文字符大小为12px,在utf8里一个汉字长度为3个字节一个字节4px 而一个英文字符长度一个字节大小大约为9px
  267.       // 为了在中英文混合的情况下显示完全 设它的长度为字节数*7px)
  268.       $strc_w = strlen($this->mark_str)*7+5 ; //水印中文字符串的长度(px)

  269.       if(is_file($this->mark_logo)){ //如果存在水印logo的图片则取得logo图片的基本信息
  270.        $logo_info = getimagesize($this->mark_logo);
  271.       }

  272.       //由于imagestring函数和imagettftext函数中对于字符串开始位置不同所以英文和中文字符串的Y位置也有所不同
  273.       //imagestring函数是从文字的左上角为参照 imagettftext函数是从文字左下角为参照
  274.       switch($mark_postion){

  275.        case 1: //位置左下角
  276.        $mark_xy[0] = 5; //水印英文字符串坐标X
  277.        $mark_xy[1] = $img_info[1]-20;//水印英文字符串坐标Y
  278.        $mark_xy[2] = 5; //水印中文字符串坐标X
  279.        $mark_xy[3] = $img_info[1]-5;//水印中文字符串坐标Y
  280.        $mark_xy[4] = 5;//水印图片坐标X
  281.        $mark_xy[5] = $img_info[1]-$logo_info[1]-5;//水印图片坐标Y
  282.        break;

  283.        case 2: //位置右下角
  284.        $mark_xy[0] = $img_info[0]-$stre_w; //水印英文字符串坐标X
  285.        $mark_xy[1] = $img_info[1]-20;//水印英文字符串坐标Y
  286.        $mark_xy[2] = $img_info[0]-$strc_w; //水印中文字符串坐标X
  287.        $mark_xy[3] = $img_info[1]-5;//水印中文字符串坐标Y
  288.        $mark_xy[4] = $img_info[0]-$logo_info[0]-5;//水印图片坐标X
  289.        $mark_xy[5] = $img_info[1]-$logo_info[1]-5;//水印图片坐标Y
  290.        break;

  291.        case 3: //位置左上角
  292.        $mark_xy[0] = 5; //水印英文字符串坐标X
  293.        $mark_xy[1] = 5;//水印英文字符串坐标Y
  294.        $mark_xy[2] = 5; //水印中文字符串坐标X
  295.        $mark_xy[3] = 15;//水印中文字符串坐标Y
  296.        $mark_xy[4] = 5;//水印图片坐标X
  297.        $mark_xy[5] = 5;//水印图片坐标Y
  298.        break;

  299.        case 4: //位置右上角
  300.        $mark_xy[0] = $img_info[0]-$stre_w; //水印英文字符串坐标X
  301.        $mark_xy[1] = 5;//水印英文字符串坐标Y
  302.        $mark_xy[2] = $img_info[0]-$strc_w; //水印中文字符串坐标X
  303.        $mark_xy[3] = 15;//水印中文字符串坐标Y
  304.        $mark_xy[4] = $img_info[0]-$logo_info[0]-5;//水印图片坐标X
  305.        $mark_xy[5] = 5;//水印图片坐标Y
  306.        break;

  307.        default : //其它默认为右下角
  308.        $mark_xy[0] = $img_info[0]-$stre_w; //水印英文字符串坐标X
  309.        $mark_xy[1] = $img_info[1]-5;//水印英文字符串坐标Y
  310.        $mark_xy[2] = $img_info[0]-$strc_w; //水印中文字符串坐标X
  311.        $mark_xy[3] = $img_info[1]-15;//水印中文字符串坐标Y
  312.        $mark_xy[4] = $img_info[0]-$logo_info[0]-5;//水印图片坐标X
  313.        $mark_xy[5] = $img_info[1]-$logo_info[1]-5;//水印图片坐标Y
  314.        break;
  315.       }
  316.       return $mark_xy;
  317.      }

  318.      /**
  319.       * 创建源图片
  320.       * @access private
  321.       * @param string $source_img 源图片(路径+文件名)
  322.       * @return img 从目标文件新建的图像
  323.       */
  324.      private function img_create($source_img) {
  325.       $info = getimagesize($source_img);
  326.       switch ($info[2]){
  327.                 case 1:
  328.                 if(!function_exists('imagecreatefromgif')){
  329.                  $source = @imagecreatefromjpeg($source_img);
  330.                 }else{
  331.                  $source = @imagecreatefromgif($source_img);
  332.                 }
  333.                 break;
  334.                 case 2:
  335.                 $source = @imagecreatefromjpeg($source_img);
  336.                 break;
  337.                 case 3:
  338.                 $source = @imagecreatefrompng($source_img);
  339.                 break;
  340.                 case 6:
  341.                 $source = @imagecreatefromwbmp($source_img);
  342.                 break;
  343.                 default:
  344.        $source = FALSE;
  345.        break;
  346.             }
  347.       return $source;
  348.      }

  349.      /**
  350.       * 重命名图片
  351.       * @access private
  352.       * @param string $source_img 源图片路径+文件名
  353.       * @return string $dst_name 重命名后的图片名(路径+文件名)
  354.       */
  355.      private function set_newname($sourse_img) {
  356.       $info = pathinfo($sourse_img);
  357.       $new_name = $this->resize_w.'_'.$this->resize_h.'_'.$info['basename'];//将文件名修改为:宽_高_文件名
  358.       if($this->dst_path == ''){ //如果存放缩略图路径为空则默认为源文件同文件夹
  359.        $dst_name = str_replace($info['basename'],$new_name,$sourse_img);
  360.       }else{
  361.        $dst_name = $this->dst_path.$new_name;
  362.       }
  363.       return $dst_name;
  364.      }

  365.      /**
  366.       * 输出图片
  367.       * @access private
  368.       * @param $im 处理后的图片
  369.       * @param $dst_name 输出后的的图片名(路径+文件名)
  370.       * @return 输出图片
  371.       */
  372.      public function img_output($im,$dst_name) {
  373.       $info = getimagesize($this->source_img);
  374.       switch ($info[2]){
  375.                 case 1:
  376.                 if(!function_exists('imagegif')){
  377.                  imagejpeg($im,$dst_name);
  378.                 }else{
  379.                  imagegif($im, $dst_name);
  380.                 }
  381.                 break;
  382.                 case 2:
  383.                 imagejpeg($im,$dst_name);
  384.                 break;
  385.                 case 3:
  386.                 imagepng($im,$dst_name);
  387.                 break;
  388.                 case 6:
  389.                 imagewbmp($im,$dst_name);
  390.                 break;
  391.             }
  392.      }

  393.      }
  394.     ?>
复制代码
这个写成了上传文件类就方便多了,把上面代码保存一个文件它就可以公共调用与修改删除了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|王牌互联

GMT+8, 2024-11-17 06:28 , Processed in 0.035099 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表