表单的写法
<html>
<head>
<title>upload html</title>
</head>
<body>
<form action='doAction1.php' method='post' enctype='multipart/form-data'>
Please select the file you want to upload
<input type='file' name='myFile'>
<input type='submit' value='upload file'>
</form>
</form>
</body>
</html>
upload 的几个全局变量
这是总的_FILES[‘myFile’];
-
filename=
fileInfo[‘name’];
-
type=
fileInfo[‘type’];
-
tmpname=
fileInfo[‘tmp_name’];
-
size=
fileInfo[‘size’];
-
error=
fileInfo[‘error’];
所以相应的上传了之后print_r[‘_FILES’];可以看到
Array
(
[myFile] => Array
(
[name] => contents.xml
[type] => text/xml
[tmp_name] => /Applications/MAMP/tmp/php/phpHKjygu
[error] => 0
[size] => 28210
)
)
判断是否产生错误
$error==UPLOAD_ERR_OK
error对应的错误
case 1:
echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
break;
case 2:
echo '超过了表单MAX_FILE_SIZE限制的大小';
break;
case 3:
echo '文件部分被上传';
break;
case 4:
echo '没有选择上传文件';
break;
case 6:
echo '没有找到临时目录';
break;
case 7:
case 8:
echo '系统错误';
break;
其实PHP中也定义了各种错误:
UPLOAD_ERR_OK //0
UPLOAD_ERR_INI_SIZE //1
UPLOAD_ERR_FROM_SIZE //2
UPLOAD_ERR_PARTIAL //3
UPLOAD_ERR_NO_FILE //4
UPLOAD_ERR_NO_TMP_DIR //5
UPLOAD_ERR_CANT_WRITE //7
UPLOAD_ERR_EXTENSION //8
判断文件类型是否合法
我们可以定义相应的文件类型和合法的最大的文件大小。
$maxSize=1024;
$allowExt=array('jpg','bmp','png','gif','wimp');
获得文件的后缀来判断文件的类型
<?php
$path_parts=pathinfo('./doAction.php');
echo $path_parts['dirname']."<br>";
echo $path_parts['basename']."<br>";
echo $path_parts['extension']."<br>";
echo $path_parts['filename']."<br>";
?>
if(in_array($ext,$allowext));
...
在这里为了避免出现后缀是”JPG”类似的大写的情况,我们可以使用strtolower()函数.
pathinfo()函数原型
mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
其实这个函数只是对字符串进行了相应的处理而已
安全性的分析
bool is_uploaded_file ( string $filename )
判断是否是通过http post方法上传上来的
判断是否是图片文件
<?php
if(getimagesize('./false.jpg'))
echo'True';
else
echo'False';
?>
这里getimagesize不仅仅判断了后缀名。函数原型如下
array getimagesize ( string $filename [, array &$imageinfo ] )
移动文件
如果没有将上传的文件移走的话是默认会放在tmp文件夹的,移动文件的话要用到函数move_uploaded_file
bool move_uploaded_file ( string $filename , string $destination )
为了避免重名我们可以对文件进行重命名
用md5(uniqid(microtime(true),true)).'.'.$ext;
//microtime(true)返回一个floag
比如说默认$path='uploads'
但是file_exists ($path)
所以
mkdir($path,0777,true);//允许递归地创建,类似于mkdir -p
chmod($path,0777);//修改权限
函数封装
避免重复地使用,将上传封装成为一个函数
<?php
function UploadFile($fileinfo,$path="myupload",$allowExt=array('jpg','bmp','png','gif','wimp'),$maxSize=2097152){
$error=$fileinfo['error'];
$filename=$fileinfo['name'];
$tmpname=$fileinfo['tmp_name'];
$size=$fileinfo['size'];
if($error==UPLOAD_ERR_OK){
if(!is_uploaded_file($tmpname))
die("不是上传上来的");
$ext=pathinfo($filename,PATHINFO_EXTENSION);
if(!in_array($ext, $allowExt))
die("文件类型不被允许");
if(!getimagesize($tmpname))
die("不是图片文件");
if($size>$maxSize)
die("文件过大");
//接下来说明文件是图片文件
$newfilename=md5(uniqid(microtime(True),True)).'.'.$ext;
$destination=$path.'/'.$newfilename;
//判断文件路径是否存在
if(!file_exists($path)){
mkdir($path,0777,True);
chmod($path,0777);
}
if(move_uploaded_file($tmpname,$destination)){
echo "upload successfully";
}
else{
echo "Unexpected Error";
}
}
else switch ($error) {
case UPLOAD_ERR_INI_SIZE:
echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';//$error=1
break;
case UPLOAD_ERR_FROM_SIZE :
echo '超过了表单MAX_FILE_SIZE限制的大小';//$error=2
break;
case UPLOAD_ERR_PARTIAL:
echo '文件部分被上传';//$error=3
break;
case UPLOAD_ERR_NO_FILE:
echo '没有选择上传文件';//$error=4
break;
case UPLOAD_ERR_NO_TMP_DIR:
break;//$error=5;
case UPLOAD_ERR_CANT_WRITE:
echo '没有找到临时目录';
break;//$error=7;
case UPLOAD_ERR_EXTENSION :
echo '系统错误';
break;//$error=8
}
}
?>
使用时
include_once 'upload.func.php';
$fileInfo=$_FILES['myFile'];
$allowExt=array('jpeg','jpg','png','gif','html','txt');
$newName=uploadFile($fileInfo,'uploads',false,$allowExt);
echo
多文件上传
表单
<html>
<head>
<title></title>
</head>
<body>
<form action="doAction.php" method="post" enctype="multitype/form-data">
<input type="file" name='myFile[]'><br>
<input type="file" name='myFile[]'><br>
<input type="file" name='myFile[]'><br>
</form>
<input type="submit" value="upload">
</body>
</html>
//doAciton.php
<?php
header('content-type:text/html;charset=utf-8');
include_once 'upload.func.php';
foreach($_FILES as $fileInfo){
$files[]=uploadFile($fileInfo);
}
print_r($files);
多文件上传成功之后print_r可以看到
Array
(
[0] => ./uploads/afab76605954f58e97460aa97562bb6c.jpg
[1] => ./uploads/b0b04dc7ebd69502df954eb74d15a4be.jpg
)