PHP 多个文件上传
关键函数:
is_uploaded_file():用于判断指定的文件是否是通过 HTTP POST 上传的,如果是则返回 TRUE。用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件。
move_uploaded_file():文件上传后,首先会存储在服务器的临时目录中,可以是该函数将上传的文件移动到新位置。与 copy() 和 move() 相比,该函数还有一种额外的功能,检查并确保由第一个参数 filename 指定的文件,是否是合法的上传文件( 即通过 PHP 的 HTTP POST 上传机制所上传的 )。如果文件合法,则将其移动为由第二个参数 destination 指定的文件。如果 filename 不是合法的上传文件,不会出现任何操作,将返回 FALSE。如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,也将返回FALSE。此外还将发出一条警告。若成功则返回TRUE。
其他函数:
array_pop():弹出并返回数组中的最后一个元素,并将 array 的长度减1。案例中用于取出文件后缀。
list():用数组中的元素为一组变量赋值。
多个文件上传只需要在单个文件上传的基础上,在原来的二维数组 $_FILES 之外进行一次循环。
HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>文件上传</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 选择文件1:<input type="file" name="myfile[]"><br> 选择文件2:<input type="file" name="myfile[]"><br> 选择文件3:<input type="file" name="myfile[]"><br> <input type="submit" value="上传文件"> </form> </body> </html>
图1
图2
uoload.php:
<?php $allowtype = array("gif","png","jpg"); //允许上传的文件格式 $size = 1000000; //设置允许大小1M以内的文件 $path = "./uploads"; //设置上传后保存文件的路径 //判断文件是否可以上传到服务器 $_FILES['myfile'][error]为0表示成功 //循环 for( $i = 0;$i < count($_FILES['myfile']['error']);$i++ ){ $upfile[$i] = $_FILES['myfile']['name'][$i]; if($_FILES['myfile']['error'][$i]>0){ echo "上传错误"; switch($_FILES['myfile']['error'][$i]){ case 1: die('第'.($i+1).'个文件上传文件大小超出了PHP配置文件中的约定值:upload_max_filesize'); case 2: die('上传第'.($i+1).'个文件大小超出了表单中的约定值:MAX_FILE_SIZE'); case 3: die('第'.($i+1).'个文件只被部分上传'); case 4: die('第'.($i+1).'个文件没有上传'); default: die('未知错误'); } } //判断上传的文件是否为允许的文件类型,通过文件的后缀名 //array_pop 弹出并返回数组中的最后一个元素,并将array的长度减1 $hz[$i] = array_pop(explode(".",$_FILES['myfile']['name'][$i])); if(!in_array($hz[$i],$allowtype)){ die("第".($i+1)."个文件后缀是<b>{$hz}</b>,不是允许的文件类型!"); } /*也可通过获取上传文件的MIME类型中的主类型和子类型,来限制文件上传的类型 list($maintype,$subtype) = explode("/",$_FILES['myfile']['type']); if($maintype == "text"){ die("不能上传文本文件"); } */ //判断上传的文件是否允许大小 if($_FILES['myfile']['size'][$i]>$size){ die("第".($i+1)."个文件超过了允许的<b>{$size}</b>"); } //为了系统安全,同时也为了同名文件不被覆盖,上传后将文件名使用系统定义 $filename[$i] = date("YmdHis").rand(100,999).".".$hz[$i]; //判断是否为上传文件 if(is_uploaded_file($_FILES['myfile']['tmp_name'][$i])){ if(!move_uploaded_file($_FILES['myfile']['tmp_name'][$i],$path.'/'.$filename[$i])){ die("不能将文件移动到指定目录"); } }else{ die("上传文件{$_FILES['myfile']['name'][$i]}不是一个合法文件"); } //如果文件上传成功 $filesize[$i] = $_FILES['myfile']['size'][$i]/1024; echo "文件{$upfile[$i]}上传成功,保存在目录{$path}中,文件大小为{$filesize[$i]}KB<br>"; }
页面显示:
文件87d11a09d24848fa3ac763fe.jpg上传成功,保存在目录./uploads中,文件大小为34.60546875KB
文件0ef5e0fef0adab0f5c6008a2.jpg上传成功,保存在目录./uploads中,文件大小为37.810546875KB
文件2dbda88c96801dd6f11f3617.jpg上传成功,保存在目录./uploads中,文件大小为168.0478515625KB