一个较经典的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上传文件其实挺简单,而且这个类中的注释也很丰富,对使用帮助很大。