经典的PHP文件上传类_代码

时间:2022-09-29 18:53:44

一个较经典的PHP文件上传类代码,虽然很老,但用的人还是挺多的,当初自己在用PHP做站的时候,就用了这个类。包括有调用的例子,对新手也友好,这个类可以上传图片和其它格式的文件,看你怎么设置了。另外这个上传类可对文件上传大小限制,可自动创建文件上传目录,类中的方法用好了,可以扩展较多的功能。

001 <?php
002 // $Id: upload.class.php,v 1.0 2001/10/14 14:06:57 whxbb Exp $
003 $UPLOAD_CLASS_ERROR = array( 1 => '不允许上传该格式文件',
004                              2 => '目录不可写',
005                              3 => '文件已存在',
006                              4 => '不知名错误',
007                              5 => '文件太大'
008                             );
009  
010 /**
011 * Purpose
012 * 文件上传
013 * Example
014 *
015     $fileArr['file'] = $file;
016     $fileArr['name'] = $file_name;
017     $fileArr['size'] = $file_size;
018     $fileArr['type'] = $file_type;
019     // 所允许上传的文件类型
020     $filetypes = array('gif','jpg','jpge','png');
021     // 文件上传目录
022     $savepath = "/usr/htdocs/upload/";
023     // 没有最大限制 0 无限制
024     $maxsize = 0;
025     // 覆盖 0 不允许  1 允许
026     $overwrite = 0;
027     $upload = new upload($fileArr, $file_name, $savepath, $filetypes, $overwrite, $maxsize);
028     if (!$upload->run())
029     {
030      echo   $upload->errmsg();
031     }
032 *
033 * @author whxbb(whxbb@21cn.com)
034 * @version 0.1
035 */
036 class upload
037 {
038     var $file;
039     var $file_name;
040     var $file_size;
041     var $file_type;
042  
043     /** 保存名 */
044     var $savename;
045     /** 保存路径 */
046     var $savepath;
047     /** 文件格式限定 */
048     var $fileformat = array();
049     /** 覆盖模式 */
050     var $overwrite = 0;
051     /** 文件最大字节 */
052     var $maxsize = 0;
053     /** 文件扩展名 */
054     var $ext;
055     /** 错误代号 */
056     var $errno;
057  
058     /**
059      * 构造函数
060      * @param $fileArr 文件信息数组 'file' 临时文件所在路径及文件名
061                                     'name' 上传文件名
062                                     'size' 上传文件大小
063                                     'type' 上传文件类型
064      * @param savename 文件保存名
065      * @param savepath 文件保存路径
066      * @param fileformat 文件格式限制数组
067      * @param overwriet 是否覆盖 1 允许覆盖 0 禁止覆盖
068      * @param maxsize 文件最大尺寸
069      */
070     function upload($fileArr, $savename, $savepath, $fileformat, $overwrite = 0, $maxsize = 0) {
071         $this->file = $fileArr['file'];
072         $this->file_name = $fileArr['name'];
073         $this->file_size = $fileArr['size'];
074         $this->file_type = $fileArr['type'];
075  
076         $this->get_ext();
077         $this->set_savepath($savepath);
078         $this->set_fileformat($fileformat);
079         $this->set_overwrite($overwrite);
080         $this->set_savename($savename);
081         $this->set_maxsize($maxsize);
082     }
083  
084     /** 上传  */
085     function run()
086     {
087         /** 检查文件格式 */
088         if (!$this->validate_format())
089         {
090             $this->errno = 1;
091             return false;
092         }
093         /** 检查目录是否可写 */
094         if(!@is_writable($this->savepath))
095         {
096             $this->errno = 2;
097             return false;
098         }
099         /** 如果不允许覆盖,检查文件是否已经存在 */
100         if($this->overwrite == 0 && @file_exists($this->savepath.$this->savename))
101         {
102             $this->errno = 3;
103             return false;
104         }
105         /** 如果有大小限制,检查文件是否超过限制 */
106         if ($this->maxsize != 0 )
107         {
108             if ($this->file_size > $this->maxsize)
109             {
110                 $this->errno = 5;
111                 return false;
112             }
113         }
114         /** 文件上传 */
115        if(!@copy($this->file, $this->savepath.$this->savename))
116        {
117             $this->errno = 4;
118             return false;
119        }
120        /** 删除临时文件 */
121        $this->destory();
122        return true;
123     }
124  
125     /**
126      * 文件格式检查
127      * @access protect
128      */
129     function validate_format()
130     {
131  
132         if (!is_array($this->fileformat))  // 没有格式限制
133             return true;
134        $ext = strtolower($this->ext);
135         reset($this->fileformat);
136         while(list($var, $key) = each($this->fileformat))
137         {
138             if (strtolower($key) == $ext)
139                 return true;
140         }
141         reset($this->fileformat);
142         return false;
143     }
144  
145     /**
146      * 获取文件扩展名
147      * access public
148      */
149     function get_ext()
150     {
151         $ext = explode(".", $this->file_name);
152         $ext = $ext[count($ext) - 1];
153         $this->ext = $ext;
154     }
155     /**
156      * 设置上传文件的最大字节限制
157      * @param $maxsize 文件大小(bytes) 0:表示无限制
158      * @access public
159      */
160     function set_maxsize($maxsize)
161     {
162         $this->maxsize = $maxsize;
163     }
164  
165     /**
166      * 设置覆盖模式
167      * @param 覆盖模式 1:允许覆盖 0:禁止覆盖
168      * @access public
169      */
170     function set_overwrite($overwrite)
171     {
172         $this->overwrite = $overwrite;
173     }
174  
175     /**
176      * 设置允许上传的文件格式
177      * @param $fileformat 允许上传的文件扩展名数组
178      * @access public
179      */
180     function set_fileformat($fileformat)
181     {
182         $this->fileformat = $fileformat;
183     }
184  
185     /**
186      * 设置保存路径
187      * @param $savepath 文件保存路径:以 "/" 结尾
188      * @access public
189      */
190     function set_savepath($savepath)
191     {
192         $this->savepath = $savepath;
193     }
194     /**
195      * 设置文件保存名
196      * @savename 保存名,如果为空,则系统自动生成一个随机的文件名
197      * @access public
198      */
199     function set_savename($savename)
200     {
201         if ($savename == ''// 如果未设置文件名,则生成一个随机文件名
202         {
203             srand ((double) microtime() * 1000000);
204             $rnd = rand(100,999);
205             $name = date('Ymdhis') + $rnd;
206             $name = $name.".".$this->ext;
207         } else {
208             $name = $savename;
209         }
210         $this->savename = $name;
211     }
212     /**
213      * 删除文件
214      * @param $file 所要删除的文件名
215      * @access public
216      */
217     function del($file)
218     {
219         if(!@unlink($file))
220         {
221             $this->errno = 3;
222             return false;
223         }
224         return true;
225     }
226     /**
227      * 删除临时文件
228      * @access proctect
229      */
230     function destory()
231     {
232         $this->del($this->file);
233     }
234  
235     /**
236      * 得到错误信息
237     * @access public
238       * @return error msg string or false
239      */
240     function errmsg()
241     {
242         global $UPLOAD_CLASS_ERROR;
243          
244         if ($this->errno == 0)
245             return false;
246         else
247             return $UPLOAD_CLASS_ERROR[$this->errno];
248     }
249 }
250 ?>

水平高的拿去自己扩展吧,PHP上传文件其实挺简单,而且这个类中的注释也很丰富,对使用帮助很大。