php文件上传之多文件上传

   在胡说以前,首先声明,本文是创建在掌握php单文件上传的基础上,因此这里就不赘述文件上传服务器配置,表单设置该注意的地方了。php

   话很少少,直入主题,在请求页面方面有两种写法(只呈现表单部分,以上传三个文件为例。)数组

    

<form action="doAction.php" method="post" enctype="multipart/form-data">
        请选择个人上传文件
        <input type="file" name="myfile[]"/>
        <input type="file" name="myfile[]" />
        <input type="file" name="myfile[]" />
        <input type="submit" value="上传" />
</form>
<form action="doAction.php" method="post" enctype="multipart/form-data">
        请选择个人上传文件
        <input type="file" name="myfil1"/>
        <input type="file" name="myfil2"/>
        <input type="file" name="myfil3"/>
        <input type="submit" value="上传" />
    </form>

  两个对比,发现仅仅是name的不一样,第一个将name设置成数组的形式,而第二个则是咱们一般设置也很容易想到的一种方法。服务器

  虽然表面上显示的仅仅有一点点不一样,但真正提交到doAction.php页面的$_FILES则有很大不一样。函数

  第一种的$_FILES是一个三维数组,而第二种是二维数组,以下:post

  

    

  

显然咱们处理第二种格式的$_FILES更加方便。固然咱们也能够想办法将第一种格式的$_FILES转化为第二种形式,以下:\spa

function getFiles(){


    foreach($_FILES as $file){
        $fileNum=count($file['name']);
        if ($fileNum==1) {

            $files=$file;
        }else{
            
            for ($i=0; $i < $fileNum; $i++) { 
                $files[$i]['name']=$file['name'][$i];
                $files[$i]['type']=$file['type'][$i];
                $files[$i]['tmp_name']=$file['tmp_name'][$i];
                $files[$i]['error']=$file['error'][$i];
                $files[$i]['size']=$file['size'][$i];
            }
        }

        
    }
    return $files;
}

 

      经过这个函数,将$_FILES转化为下面格式:3d

  

  此刻,两种上传方式已经处在同一块儿跑线了,下面的工做即是编写uploadFile()函数对每一个文件进行上传,这也是本文的重点。code

  文件上传函数:orm

function uploadFile($file,$path='./uploads',$max_size,$allowExt){
  $filename=$file['name'];
    $type=$file['type'];
    $temp_name=$file['tmp_name'];
    $error=$file['error'];
    $size=$file['size'];


    if ($error==UPLOAD_ERR_OK) {
        if ($size>$max_size) {
            $res['mes']=$filename."文件超过规定上传大小";
        }
        $ext=getExt($filename);
        if (!in_array($ext, $allowExt)) {
            $res['mes']=$filename.'文件名不合乎规范';
        }
        if (!is_uploaded_file($temp_name)) {
            $res['mes']=$filename."文件不是经过HTTP POST 方法上传上传过来的";
        }


        if (@$res) {
            return  $res;
        }


        if (!file_exists($path)) {
            mkdir($path,0777,true);
      chmod($path, 0777);
        }
        $fname=getUniName();


        $destination=$path.'/'.$fname.'.'.$ext;
        if (move_uploaded_file($temp_name, $destination)) {
            $res['mes']=$filename.'上传成功';
            $res['dest']=$destination;
        }else{
            $res['mes']=$filename."文件上传失败";
        }
    }else{
        switch ($error) {
            case '1':
            $res['mes']="超过了配置文件上传文件的大小";
            break;
            case '2':
            $res['mes']="超过表单设置上传文件文件的大小";
            break;
            case '3':
            $res['mes']="文件部分被上传";
            break;
            case '4':
            $res['mes']="没有文件被上传";

            break;
            case '6':
            $res['mes']="没有找到临时目录";
            break;
            case '7':
            $res['mes']="文件不可写";

            break;
            default:
            $res['mes']="上传文件失败";
            break;
        }
    }

    return $res;

}

其中还涉及了两个小函数:blog

/**
 * 得到文件扩展名
 * @param  string $filename 上传文件名
 * @return string           返回扩展名
 */
function getExt($filename){
    $arr=explode('.', basename($filename));

    return end($arr);
}
/**
 * 得到文件惟一扩展名
 * @return string 通过md5后生成32位惟一的上传文件名
 */
function getUniName(){

    return md5(uniqid(microtime(true),true)); 
}

 

感觉:

  好久前接触过php文件上传,当时感受一团乱麻。如今看来只要掌握$_FILES里面包含什么信息,利用本身写过的知识处理一些小技巧,系统有逻辑的加以考虑,适时地封装函数,之后文件上传就能够很快地展开。此次我展示的代码必然不是能知足任何须要,因此能够适当改造,成为本身的代码。好比若是要求上传文件是图片内容的话,单靠扩展名是绝对不能判断的,还须要利用图片的特性加以验证。

相关文章
相关标签/搜索