php多图片(文件)上传

本人两天前写了一个单个图片上传的博客,现在写一个多文件上传的
先写一个添加图片的界面,比较简陋,但是这里有三种不同的方式
第一种:

"doAction3.php" method="post" enctype="multipart/form-data"> type="file" name="myFile1" />
type="file" name="myFile2"/>
type="file" name="myFile3"/>
type="submit" value="上传"/>

第二种:

"doAction3.php" method="post" enctype="multipart/form-data"> type="file" name="myFile[]" />
type="file" name="myFile[]"/>
type="file" name="myFile[]"/>
type="submit" value="上传"/>

第三种

"doAction3.php" method="post" enctype="multipart/form-data"> type="file" name="myFile[]" multiple="multiple" />
type="submit" value="上传"/>

第一种说白了就是多个单文件上传,再次不再多加描述,不懂的可以去看我上一集写的博客
单文件上传

主要说第二种和第三种
第二种,是点击一次,选择一个文件,图中只有三行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数组中
运行一下,发现页面上输出了包含三个文件的文件名的数组,且文件夹中出现了三个文件,至此上传成功

你可能感兴趣的:(php,上传图片,多文件上传)