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