form表单提交的文件内容指向了file.php。
我们在file.php中,通过PHP代码,来处理上传文件。
我们选择一个图片进行上传。假设图片的名字为:psu.jpg,点击上传。
PHP为文件类数据准备了一个专用的系统函数$_FILES,上传文件的所有相关数据,都保存在这个系统函数中。
在PHP文件中,我们打印 $_FILES ,来观察这个数组的结构:
<?php
//var_dump()或print_r()
//打印变量的相关信息,将变量的信息详细的展示出来
var_dump($_FILES);
?>
打印出来的结果的数组结构如下:
array (size=1)
"file" =>
array (size=5)
//文件名
"name" => string "psu.jpg" (length=7)
//文件的mime类型
"type" => string "image/jpeg" (length=10)
//缓存文件,上传的图片即保存在这里
"tmp_name" => string "E:wamp mpphpC32A.tmp" (length=23)
//错误码,详见上面错误码介绍
"error" => int 0
//上传的文件大小
"size" => int 225824
得到了上面的数组结构。
我们就可以开始文件的处理过程了。
第一步,判断错误码:
<?php
if($_FILES["file"]["error"] > 0){
switch ($_FILES["file"]["error"]) { //错误码不为0,即文件上传过程中出现了错误
case "1":
echo "文件过大";
break;
case "2":
echo "文件超出指定大小";
break;
case "3":
echo "只有部分文件被上传";
break;
case "4":
echo "文件没有被上传";
break;
case "6":
echo "找不到指定文件夹";
break;
case "7":
echo "文件写入失败";
break;
default:
echo "上传出错<br/>";
}
}else{
//错误码为0,即上传成功,可以进行后续处理,处理流程见下文
}
?>
上面的代码详细的介绍了错误码和对应的错误,我们可以根据错误码,来生成准确的错误提示。
第二步,判断文件是否超出大小。
在实际项目中,由于系统硬件的限制,以及存储设备的限制,不可能让用户无限制的上传文件,所以我们要对用户上传的文件大小进行限制。定义一个合适的限制大小,能让我们的应用更稳定的运行。
//判断错误
if($_FILES["file"]["error"] > 0){
//有错误可停止执行
}else{
//当前上传文件无误,运行本段代码
//判断文件是否超出了指定的大小
//单位为byte
$MAX_FILE_SIZE = 100000;
if($_FILES["file"]["size"] > $MAX_FILE_SIZE){
//判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示
exit("文件超出指定大小");
}
将我们指定的文件大小,定义为$MAX_FILE_SIZE,该变量的计数单位为byte,对应上传文件的 $_FILES["file"]["size"]大小。
示例代码中,限制大小约为100K及以下的文件。
第三步,判断文件的mime类型是否正确。
更多的时候,我们的文件上传功能,都需要判断用户上传的文件,是否符合要求,不可用的文件上传以后,对于线上应用的整体展示效果,会造成恶劣的影响。所以我们需要通过mime类型和后缀名,来判断用户上传的文件是否符合要求。
下面的示例代码中,我们假设当前的项目需求为指定上传图片,要求上传后缀名为GIF或者jpg的文件,当用户上传不符合要求的文件时,返回错误提示。
/*判断后缀名和MIME类型是否符合指定需求
例如:
当前项目指定上传后缀为.jpg或.gif的图片,则$allowSuffix = array("jpg","gif");
*/
//定义允许的后缀名数组
$myImg = explode(".", $_FILES["file"]["name"]);
/*
explode() 将一个字符串用指定的字符切割,并返回一个数组,这里我们将文件名用".""切割,结果存在$myImg中,文件的后缀名即为数组的最后一个值
*/
$myImgSuffix = array_pop($myImg);
/*
根据上传文件名获取文件的后缀名
使用in_array()函数,判断上传文件是否符合要求
当文件后缀名不在我们允许的范围内时退出上传并返回错误信息
*/
if(!in_array($myImgSuffix, $allowSuffix)){
exit("文件后缀名不符");
}
/*
mime类型和文件后缀名的对应关系,我们可以通过很多途径查询到,为了避免用户自主修改文件后缀名造成文件无法使用。
mime类型也必须做出限制检查mime类型,是为了防止上传者直接修改文件后缀名
导致文件不可用或上传的文件不符合要求。
*/
//数组内容为允许上传的mime类型
$allowMime = array(
"image/jpg",
"image/jpeg",
"image/pjpeg",
"image/gif"
);
if(!in_array($_FILES["file"]["type"], $allowMime)){ //判断上传文件的mime类型是否在允许的范围内
exit("文件格式不正确,请检查");
//如果不在允许范围内,退出上传并返回错误信息
}
第四步,生成指定的路径和文件名。
按照项目的文件安排,生成文件存储路径,为了避免文件名重复而产生的错误,按照一定的格式,生成一个随机文件名。
//指定上传文件夹
$path = "upload/images/";
/*
根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名
*/
$name = date("Y").date("m").date("d").date("H").date("i").date("s").rand(0,9).".".$myImgSuffix;
第五步,判断是否是上传文件。
is_uploaded_file()函数是专用的函数,来判断目标文件是否是上传文件。
<?php
//使用is_uploaded_file()判断是否是上传文件,函数介绍见上文
if(is_uploaded_file($_FILEs["file"]["tmp_name"])){
}
?>
第六步,移动文件到指定位置。
使用move_uploaded_file()函数,将文件移动到指定的位置,并命名。需要注意的是,Linux系统中对目标目录是否有权限及磁盘空间是否足够,否则会导致上传操作失败。
/*
使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。
*/
if(move_uploaded_file($_FILEs["file"]["tmp_name"], $path.$name)){
//提示文件上传成功
echo "上传成功";
}else{
/*
文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限
*/
echo "上传失败";
}
}else{
echo "不是上传文件";
}
}
?>
我们将这个文件片段整理成一整个文件:
<?php
if ($_FILES["file"]["error"] > 0) {
switch ($_FILES["file"]["error"]) {
//错误码不为0,即文件上传过程中出现了错误
case "1":
echo "文件过大";
break;
case "2":
echo "文件超出指定大小";
break;
case "3":
echo "只有部分文件被上传";
break;
case "4":
echo "文件没有被上传";
break;
case "6":
echo "找不到指定文件夹";
break;
case "7":
echo "文件写入失败";
break;
default:
echo "上传出错<br/>";
}
} else {
$MAX_FILE_SIZE = 100000;
if ($_FILES["file"]["size"] > $MAX_FILE_SIZE) {
exit("文件超出指定大小");
}
$allowSuffix = array(
"jpg",
"gif",
);
$myImg = explode(".", $_FILES["file"]["name"]);
$myImgSuffix = array_pop($myImg);
if (!in_array($myImgSuffix, $allowSuffix)) {
exit("文件后缀名不符");
}
$allowMime = array(
"image/jpg",
"image/jpeg",
"image/pjpeg",
"image/gif",
);
if (!in_array($_FILES["file"]["type"], $allowMime)) {
exit("文件格式不正确,请检查");
}
$path = "upload/images/";
$name = date("Y") . date("m") . date("d") . date("H") . date("i") . date("s") . rand(0, 9) . "." . $myImgSuffix;
if (is_uploaded_file($_FILEs["file"]["tmp_name"])) {
if (move_uploaded_file($_FILEs["file"]["tmp_name"], $path . $name)) {
echo "上传成功";
} else {
echo "上传失败";
}
} else {
echo "不是上传文件";
}
}
?>