本人两天前写了一个单个图片上传的博客,现在写一个多文件上传的
先写一个添加图片的界面,比较简陋,但是这里有三种不同的方式
第一种:
第二种:
第三种
第一种说白了就是多个单文件上传,再次不再多加描述,不懂的可以去看我上一集写的博客
单文件上传
主要说第二种和第三种
第二种,是点击一次,选择一个文件,图中只有三行input代码,所以只能一次性上传3张图片
第三种,是点击一次,可以选择多张图片,选择完成,点击提交之前会显示选择了几个文件
第二种和第三种,点击上传之后我们在后端接受到的都是一个一样的三维数组,如图所示,我们先打印出来看看这个三维数组
[myFile] => Array
(
[name] => Array
(
[0] => 上海建桥学院 Shanghai Jian Qiao University.jpg
[1] => 54c5b4120001f20808000902.jpg
[2] => 52e3677900013d6a05020261.jpg
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
[2] => image/jpeg
)
[tmp_name] => Array
(
[0] => C:\wamp\tmp\php4945.tmp
[1] => C:\wamp\tmp\php4B78.tmp
[2] => C:\wamp\tmp\php4BE6.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[size] => Array
(
[0] => 876196
[1] => 159952
[2] => 28190
)
)
我们可以看到,这是把单个文件中的各个属性归了类,重新组成了一个数组,因此我们要把这个数组转换多个单文件数组:
function buildInfo(){
// $info = $_FILES;
$i = 0;
foreach ($_FILES as $v){//三维数组转换成2维数组
if(is_string($v['name'])){ //单文件上传
$info[$i] = $v;
$i++;
}else{ // 多文件上传
foreach ($v['name'] as $key=>$val){//2维数组转换成1维数组
//取出一维数组的值,然后形成另一个数组
//新的数组的结构为:info=>i=>('name','size'.....)
$info[$i]['name'] = $v['name'][$key];
$info[$i]['size'] = $v['size'][$key];
$info[$i]['type'] = $v['type'][$key];
$info[$i]['tmp_name'] = $v['tmp_name'][$key];
$info[$i]['error'] = $v['error'][$key];
$i++;
}
}
}
return $info;
}
通过以上封装的buildInfo方法,我们可以把传过来的三维数组转换为多个单文件数组,我们打印出来看一下:
array
0 =>
array
'name' => string '上海建桥学院 Shanghai Jian Qiao University.jpg' (length=52)
'size' => int 876196
'type' => string 'image/jpeg' (length=10)
'tmp_name' => string 'C:\wamp\tmp\phpC8A5.tmp' (length=23)
'error' => int 0
1 =>
array
'name' => string '54c5b4120001f20808000902.jpg' (length=28)
'size' => int 159952
'type' => string 'image/jpeg' (length=10)
'tmp_name' => string 'C:\wamp\tmp\phpCAA9.tmp' (length=23)
'error' => int 0
2 =>
array
'name' => string '52e3677900013d6a05020261.jpg' (length=28)
'size' => int 28190
'type' => string 'image/jpeg' (length=10)
'tmp_name' => string 'C:\wamp\tmp\phpCB08.tmp' (length=23)
'error' => int 0
如图所示,我们已经得到了多个单文件(图片)组成的新数组,接下来我们来上传:
function uploadfile($path="uploads",
$allowExt = array('png','jpg','jpeg','gif','mmp','qnmlgb'),
$maxSize=1048576,$imgFlag=true){
if (! file_exists($path)) {
mkdir($path,0777,true);
}
$i = 0;
$infoArr = buildInfo();
foreach ($infoArr as $val) {
if ($val['error'] === UPLOAD_ERR_OK) {
$ext = getExt($val['name']);
for($j=0;$j$allowExt);$j++){
if($ext == $allowExt[$j]){
$m = "此文件适合上传标准";
$h = $m;
}else {
$m = "此文件不可以被上传";
}
}
if($h){
$mes = "文件格式正确";
}else{
$mes = "文件格式错误";
exit;
}
if($val['size']>$maxSize){
$mes = "文件太大了";
exit;
}
if($imgFlag){
$result = getimagesize($val['tmp_name']);
if(!$result){
$mes = "您上传的不是一个真正图片";
exit;
}
}
if(!is_uploaded_file($val['tmp_name'])){
$mes = "不是通过httppost传输的";
exit;
}
$realName = getUniName().".".$ext;
$destination = $path."/".$realName;
if(move_uploaded_file($val['tmp_name'], $destination)){
$val['name'] = $realName;
unset($val['error'],$val['tmp_name'],$val['size'],$val['type']);
$uploadedFiles[$i]=$val;//?????????
$i++;
}
}else {
switch ($val['error']) {
case 1: // UPLOAD_ERR_INI_SIZE
$mes = "超过配置文件中上传文件的大小";
break;
case 2: // UPLOAD_ERR_FORM_SIZE
$mes = "超过表单中配置文件的大小";
break;
case 3: // UPLOAD_ERR_PARTIAL
$mes = "文件被部分上传";
break;
case 4: // UPLOAD_ERR_NO_FILE
$mes = "没有文件被上传";
break;
case 6: // UPLOAD_ERR_NO_TMP_DIR
$mes = "没有找到临事文件目录";
break;
case 7: // UPLOAD_ERR_CANT_WRITE
$mes = "文件不可写";
break;
case 8: // UPLOAD_ERR_EXTENSION
$mes = "php扩展程序中断了上传程序";
break;
}
echo $mes;
}
}
return $uploadedFiles;
}
在封装函数的时候我们把这几个默认变量赋值了:
$path="uploads", //文件存放路径
$allowExt = array('png','jpg','jpeg','gif','mmp','qnmlgb')//可被存放的文件后缀名,注mmp,qnmlgb是我瞎写的后缀名
$maxSize=1048576,//设置文件上传的大小,1048576为1m
$imgFlag=true//判断是否真为一张图片,可为true,也可为false
接来下就是各种判断:
if (! file_exists($path)) {
mkdir($path,0777,true);
}
这是用来判断路径是否存在,要是不存在则创建
$i = 0;
$infoArr = buildInfo();
我们设置一个$infoArr来接受上面已经转化好的多个单文件数组,接下来就是用foreach循环来上传图片,并返回一个包含所有上传图片名称的数组,我们一步步来看
foreach ($infoArr as $val) {
if ($val['error'] === UPLOAD_ERR_OK) {
}else {
switch ($val['error']) {
case 1: // UPLOAD_ERR_INI_SIZE
$mes = "超过配置文件中上传文件的大小";
break;
case 2: // UPLOAD_ERR_FORM_SIZE
$mes = "超过表单中配置文件的大小";
break;
case 3: // UPLOAD_ERR_PARTIAL
$mes = "文件被部分上传";
break;
case 4: // UPLOAD_ERR_NO_FILE
$mes = "没有文件被上传";
break;
case 6: // UPLOAD_ERR_NO_TMP_DIR
$mes = "没有找到临事文件目录";
break;
case 7: // UPLOAD_ERR_CANT_WRITE
$mes = "文件不可写";
break;
case 8: // UPLOAD_ERR_EXTENSION
$mes = "php扩展程序中断了上传程序";
break;
}
echo $mes;
}
我们可以看出这是用来判断error类型的,只有当error的值为UPLOAD_ERR_OK时才可以进行下一步判断
$ext = getExt($val['name']);
for($j=0;$j$allowExt);$j++){
if($ext == $allowExt[$j]){
$m = "此文件适合上传标准";
$h = $m;
}else {
$m = "此文件不可以被上传";
}
}
if($h){
$mes = "文件格式正确";
}else{
$mes = "文件格式错误";
exit;
}
这是用来判断文件后缀名的方法,当数组中name的值得后缀名在我们规定的范围内时,我们才允许进行下一步,否则直接退出。
代码中的getExt($val[‘name’])
getExt()这是我们之前定义的方法,作用是截取文件名的后缀名代码如下
/**
* 得到文件的扩展名
* @param unknown $fileName
* @return string
*/
function getExt($fileName){
return strtolower(end(explode('.',$fileName)));
/**
* strtolower() 函数把字符串转换为小写。
* end()输出数组中最后一个元素的值
* explode(),拆分字符串
*/
}
接下来继续判断
if($imgFlag){
$result = getimagesize($val['tmp_name']);
if(!$result){
$mes = "您上传的不是一个真正图片";
exit;
}
}
getimagesize这是用来判断是否真的是一张图片的方法,不是则会返回false
if($val['size']>$maxSize){
$mes = "文件太大了";
exit;
}
判断文件是否超过预设大小,之前我们设置的是1m
if(!is_uploaded_file($val['tmp_name'])){
$mes = "不是通过httppost传输的";
exit;
}
判断文件是不是通过http post方式提交的
$realName = getUniName().".".$ext;
$destination = $path."/".$realName;
if(move_uploaded_file($val['tmp_name'], $destination)){
$val['name'] = $realName;
unset($val['error'],$val['tmp_name'],$val['size'],$val['type']);
$uploadedFiles[$i]=$val;//?????????
$i++;
}
我们通过move_uploaded_file()方法将图片传递到相应文件夹中,
且将文件夹中的文件名传到 $uploadedFiles数组中
运行一下,发现页面上输出了包含三个文件的文件名的数组,且文件夹中出现了三个文件,至此上传成功