和文件上传相关的PHP配置项(php.ini):
file_uploads=on
upload_tmp_dir=上传文件保存的临时目录
upload_max_filesize=2M 上传文件最大的大小
max_file_uploads=20 允许一次最多上传多少个文件
post_max_size=8M 表单POST方式发送数据允许的最大值
【单文件上传】
准备工作:
1.客户端浏览器,在HTML中添加表单页面,添加一个浏览框
<form action="doAction.php" method="post" enctype="multipart/form-data">
<input type="file" name="myfile"/>
<input type="submit" value="上传"/>
//可在客户端利用隐藏域来限制可上传文件的大小,1024字节=1kb
//但该限制可以通过浏览器源代码直接修改限制数值后即破解,再点击上传即不受限
//<input type="hidden" name="MAX_FILE_SIZE" value="1024" />
</form>
上传文件原理:将客户端文件通过浏览器上传到服务器端
注意:表单一定要使用POST方式提交,表单必须添加属性enctype="multipart/form-data"
2.服务器端配置
上传至服务器端的文件的信息默认保存在系统预定义变量 $_FILES 中:
$_FILES['客户端浏览框的名称']['name']:上传文件的名称
$_FILES['客户端浏览框的名称']['type']:上传文件的MIME类型
$_FILES['客户端浏览框的名称']['tmp_name']:保存在服务器端的临时文件名,我们在服务器端处理的都是这个临时文件
$_FILES['客户端浏览框的名称']['error']:上传文件的错误号:
0:没有错误,文件上传成功
1:上传的文件超过了 php.ini 中 upload_max_filesize 限制
2:上传的文件超过了 HTML 表单中 MAX_FILE_SIZE 的值
<input type="hidden" name="MAX_FILE_SIZE" value="1024" />
可被通过客户端浏览器源代码修改限制值破解
3:文件只有部分被上传
4:没有文件被上传
6:找不到临时文件
7:文件写入失败,权限问题
8:由于PHP扩展程序中断了文件上传
$_FILES['客户端浏览框的名称']['size']:上传文件的大小(字节)
步骤一:接收上传文件的信息
$filename=$_FILES["浏览框的名称"]["name"];
$type=$_FILES["浏览框的名称"]["type"];
$tmp_name=$_FILES["浏览框的名称"]["tmp_name"];
$error=$_FILES["浏览框的名称"]["error"];
$size=$_FILES["浏览框的名称"]["size"];
步骤二:判断错误号是否为0
if($error!==0){
switch($error){
case 1:
exit("上传的文件超过了php.ini中upload_max_filesize限制");
break;
case 2:
exit("上传的文件超过了HTML表单中MAX_FILE_SIZE的值");
break;
case 3:
exit("文件只有部分被上传");
break;
case 4:
exit("没有文件被上传");
break;
case 6:
exit("找不到临时文件");
break;
case 7:
exit("文件写入失败");
break;
case 8:
exit("由于PHP扩展程序中断了文件上传");
break;
}
}
步骤三:判断文件大小、MIME类型、扩展名
if($size>2*1024*1024){
exit("上传的文件超过了规定的2M");
}
//要查看服务器允许的MIME类型:Apache/conf/mime.types文件中查看
$allow_mime=array('image/png','image/jpeg','image/gif');
if(!in_array($type,$allow_mime)){
exit("上传的文件类型不被允许");
}
$extname=pathinfo($filename,PATHINFO_EXTENSION);
步骤四:新建目录
$dir="./uploads/".date("Y/m/d");
if(!file_exists($dir)){
mkdir($dir,0777,true);
}
步骤五:新建文件名
$newfilename=md5(time().mt_rand()).".".$extname;
步骤六:文件移动
move_uploaded_file($tmp_name ,$dest) 将服务器上的临时文件移动到指定目录中并给出其文件名
注意:该文件必须是用过 HTTP POST 方式上传的文件
is_uploaded_file($tmp_name) 判断文件是否通过 HTPP POST 上传的
if(is_uploaded_file($tmp_name)){
if(move_uploaded_file($tmp_name,$dir.'/'.$newfilename)){
echo "文件上传成功";
//如有需要,则将文件信息保存下来
$info=array(
'orgfilename'=>$filename,
'newfilename'=>$newfilename,
'extname'=>$extname,
'size'=>$size,
'mime'=>$type
);
echo "<pre>";
var_dump($info);
echo "</pre>";
}
}
【多文件上传】
准备工作:
1.客户端浏览器,在HTML中添加表单页面,添加多个浏览框
<form action="doAction.php" method="post" enctype="multipart/form-data">
file1:<input type="file" name="myfile[]"/><br>
file2:<input type="file" name="myfile[]"/><br>
file3:<input type="file" name="myfile[]"/><br>
file4:<input type="file" name="myfile[]"/><br>
<input type="submit" value="上传"/>
</form>
上传文件原理:将客户端文件以数组形式通过浏览器上传到服务器端
注意:表单一定要使用POST方式提交,表单必须添加属性enctype="multipart/form-data"
2.服务器端配置
上传多文件时,$_FILES数组的结构形式为:
array(1) {
["myfile"]=>
array(5) {
["name"]=>
array(4) {
[0]=>
string(18) "icon1.png"
[1]=>
string(18) "icon2.png"
[2]=>
string(18) "icon3.png"
[3]=>
string(18) "icon4.png"
}
["type"]=>
array(4) {
[0]=>
string(9) "image/png"
[1]=>
string(9) "image/png"
[2]=>
string(9) "image/png"
[3]=>
string(9) "image/png"
}
["tmp_name"]=>
array(4) {
[0]=>
string(27) "C:WindowsTempphpA04F.tmp"
[1]=>
string(27) "C:WindowsTempphpA050.tmp"
[2]=>
string(27) "C:WindowsTempphpA051.tmp"
[3]=>
string(27) "C:WindowsTempphpA052.tmp"
}
["error"]=>
array(4) {
[0]=>
int(0)
[1]=>
int(0)
[2]=>
int(0)
[3]=>
int(0)
}
["size"]=>
array(4) {
[0]=>
int(1815)
[1]=>
int(1502)
[2]=>
int(3953)
[3]=>
int(2435)
}
}
}
为了方便之后对每一个上传文件的依次处理,须将$_FILES数组的形式改为:
array(1) {
["myfile"]=>
array(4) {
[0]=>
array(5) {
["name"]=>
string(18) "icon1.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(27) "C:WindowsTempphpA04F.tmp"
["error"]=>
int(0)
["size"]=>
int(1815)
}
[1]=>
array(5) {
["name"]=>
string(18) "icon2.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(27) "C:WindowsTempphpA050.tmp"
["error"]=>
int(0)
["size"]=>
int(1502)
}
[2]=>
array(5) {
["name"]=>
string(18) "icon3.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(27) "C:WindowsTempphpA051.tmp"
["error"]=>
int(0)
["size"]=>
int(3953)
}
[3]=>
array(5) {
["name"]=>
string(18) "icon4.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(27) "C:WindowsTempphpA052.tmp"
["error"]=>
int(0)
["size"]=>
int(2435)
}
}
}
步骤一:重组接收到的上传文件的信息$_FILES数组
$getFiles=array();
foreach ($_FILES["浏览框的名称"] as $key01 => $val01) {
foreach ($val01 as $key02 => $val02) {
$getFiles["浏览框的名称"][$key02][$key01]=$val02;
}
}
步骤二:遍历重组后的数组数据,依次对每一个上传文件进行处理
$info=array(); //用于返回处理结果
$allow_mime=array('image/png','image/jpeg','image/gif','image/wbmp');
//新建目录
$dir="./uploads/".date("Y/m/d");
foreach ($getFiles["浏览框的名称"] as $key => $val) {
//接收上传文件的信息
$filename=$val['name'];
$type=$val['type'];
$tmp_name=$val['tmp_name'];
$error=$val['error'];
$size=$val['size'];
//判断错误
if($error!==0){
switch ($error) {
case 1:
$info[$key]['retVal']=false;
$info[$key]['info']="上传的文件超过了php.ini中upload_max_filesize限制";
break;
case 2:
$info[$key]['retVal']=false;
$info[$key]['info']="上传的文件超过了HTML表单中MAX_FILE_SIZE的值";
break;
case 3:
$info[$key]['retVal']=false;
$info[$key]['info']="文件只有部分被上传";
break;
case 4:
$info[$key]['retVal']=false;
$info[$key]['info']="没有文件被上传";
break;
case 6:
$info[$key]['retVal']=false;
$info[$key]['info']="找不到临时文件";
break;
case 7:
$info[$key]['retVal']=false;
$info[$key]['info']="文件写入失败";
break;
case 8:
$info[$key]['retVal']=false;
$info[$key]['info']="由于PHP扩展程序中断了文件上传";
break;
}
continue;
}
//判断文件大小、mime类型、扩展名
if($size>2*1024*1024){
$info[$key]['retVal']=false;
$info[$key]['info']="上传的文件超过了规定的2M";
continue;
}
if(!in_array($type, $allow_mime)){
$info[$key]['retVal']=false;
$info[$key]['info']="您上传的文件类型不被允许";
continue;
}
$extname=pathinfo($filename,PATHINFO_EXTENSION);
if(!file_exists($dir)){
mkdir($dir,0777,true);
}
//新建文件名
$newfilename=md5(time().mt_rand()).".".$extname;
//文件移动
if(is_uploaded_file($tmp_name)){
if(move_uploaded_file($tmp_name, $dir.'/'.$newfilename)){
//保存信息
$info[$key]['retVal']=true;
$info[$key]['info']=array(
'orgfilename'=>$filename,
'newfilename'=>$newfilename,
'extname'=>$extname,
'filesize'=>$size,
'mime'=>$type
);
}
}
}
echo "<pre>";
var_dump($info);
echo "</pre>";