zoukankan      html  css  js  c++  java
  • 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是一个三维数组,而第二种是二维数组,如下:

      

        

      

    显然我们处理第二种格式的$_FILES更加方便。当然我们也可以想办法将第一种格式的$_FILES转化为第二种形式,如下:

    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转化为下面格式:

      

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

      文件上传函数:

    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;
    
    }

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

    /**
     * 获得文件扩展名
     * @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里面包含什么信息,利用自己写过的知识处理一些小技巧,系统有逻辑的加以考虑,适时地封装函数,以后文件上传就可以很快地展开。这次我展现的代码必然不是能满足任何需要,所以可以适当改造,成为自己的代码。比如如果要求上传文件是图片内容的话,单靠扩展名是绝对不能判断的,还需要利用图片的特性加以验证。

      

    越学习越感到自己无知
  • 相关阅读:
    redis集群
    鉴权方案选择
    spring mvc 自定义handler不拦截静态资源
    servlet3
    压测工具 ab jmeter
    死锁产生的原因
    缓存方案:本地guavaCache, 远程redis?
    使用spring boot admin
    groovy使用小记
    python--面试题01
  • 原文地址:https://www.cnblogs.com/DeanChopper/p/4673577.html
Copyright © 2011-2022 走看看