下面是一个更加复杂的文件上传实例,先看该程序的代码,稍后我们将详细讲解这个程序.该程序命名为upload.php,代码如下:
if(!$UploadAction):
?>
文件上传界面
else:
?>
文件上传代码
$UploadAction=0;
echo "Good!";
$TimeLimit=60;/*设置超时限制时间 默认时间为30秒 设置为0时为不限时*/
set_time_limit($TimeLimit);
If(($UploadFile !="none"))
{
$UploadPath=AddSlashes(dirname($PATH_TRANSLATED))."\\upload\\";
//上传文件存放路径
$FileName=$UploadPath.$UploadFile_name;//上传文件名
if($UploadFile_size < 1024) //上传文件大小
{
$FileSize=(string)$UploadFile_size." 字节";
}
elseif ($UploadFile_size < (1024 * 1024))
{
$FileSize=number_format((double)($UploadFile_size/1024),1)." KB";
}
else{
$FileSize=number_format((double) ($UploadFile_size / (1024 * 1024)).
1) . " KB";
}
if(!file_exists($FileName))
{
if(copy($UploadFile,$FileName))
{ echo "文件 $UploadFile_name ($FileSize)上传成功! ";}
else
{ echo "文件 $UploadFile_name 上传失败! "; }
unlink ($UploadFile);
}
else
{ echo "文件" $UploadFile_name 已经存在! "; }
}
else
{ echo "你没有选择任何文件上传! ";}
set_time_limit(30); //恢复默认超时设置
?>
返回
endif;
?>
该程序首先生成一个简单的上传文件截面,浏览文件,单击[上传]按钮后,将显示上传成功页面.
下面详解释上面的程序.
本程序由于同时包含上传界面和上传处理部分,故总体上可以分为两部分,我们通过在form中添加UploadAction指出当前的状态(界面或实现). if(!$UploadAction):后是一部分,else;后又是一部分.前一部分是生成上传文件界面,后一部分是处理上传文件.
首先在form表单中要将method属性设为Post,enctype属性设为multipart/form-data;
在form表单中可以加一个hidden类型的input框,其中名字为MAX_FILE_SIZE的隐藏值域,通过设置其VALUE可以限制上传文件的大小.
因为form传递过来的值会自动赋值给同名变量,所以直接通过$UploadFile 可以直接访问上传的文件,但由于这是一个保存文件的变量,因此文件名字必须通过另外一个$UploadFile_name变量取得.
上传的文件必须用一个固定的目录保存,在这里我们用一个$UploadPath 变量保存.如可以设置$UploadPath ="/home/flier/upload/",这里我们使用了复杂一点的自动定位,如:
$UploadPath=AddSlashes(dirname($PATH_TRANSLATED))."\\upload\\";
$PATH_TRANSLATED,顾名思义就是当前传送目录,我们假定以其一个名为upload的子目录来保存上传的文件.dirname函数返回其目录名,然后加上子目录名.
然后用一个变量$FileName保存完整的上传后文件名和路径:
$FileName=$UploadPath.$UploadFile_name;
在前面的form表单中定义了一个变量UploadFile,在后面处理上传文件时,我们就可以使用这个变量,直接通过$UploadFile访问上传的文件,但由于这是一个保存文件的变量,因此文件名字必须通过另外一个$UploadFile_name变量取得.
下面是这个变量的具体用法:
1.$UploadFile:在将要存放上传文件的服务器上的临时文件名
2.$UploadFile_name:在发送者系统中的初始文件名.
3.$UploadFile_size:按字节计算的上传文件的大小.
4.$UploadFile_type:多用途网际邮件扩充协议类型的文件,前提是浏览器提供这种信息,比如说"image/gif".
用set_time_limit($TimeLimit);设置超时限制时间,默认时间为30秒,设置为0时为不限时,考虑到大文件上传时容易出现超时的情况,这里加大超时限制时间.
上面我们就详细讲述了如何使用PHP进行上传.这里要重点强调两点:
A.在form表单中要将method属性设为post,enctype属性设为multipart/form-data.
B.在form表单中可以加一个hidden类型的input框,其中名字为MAX_FILE_SIZE的隐藏值域,通过设置其VALUE可以限制上传文件的大小.当然,这个值不可能超过PHP的配置文件(PHP3.0为php3.ini,PHP4.0为php.ini)中的upload_max_filesize,注意这个input框一定要放在所有file类型的input框前面,否则也是无效的.