• 技术文章 >后端开发 >php教程

    如何实现php多文件上传封装

    伊谢尔伦伊谢尔伦2017-06-27 14:17:02原创900
    多文件的上传实现

    1 利用单文件封装

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="doAction5.php" method="post" enctype="multipart/form-data">
    请选择您要上传的文件:<input type="file" name="myFile1" /><br/>
    请选择您要上传的文件:<input type="file" name="myFile2" /><br/>
    请选择您要上传的文件:<input type="file" name="myFile3" /><br/>
    请选择您要上传的文件:<input type="file" name="myFile4" /><br/>
    <input type="submit" value="上传"/>
    </form>
    </body>
    </html>
    <?php
    //print_r($_FILES);
    header('content-type:text/html;charset=utf-8');
    include_once 'upFunc.php';
    foreach ($_FILES as $fileInfo){
        $file[]=uploadFile($fileInfo);
    }

    这里的思路,从print_r($_FILES)中去找,打印出来看到是个二维数组,很简单,遍历去用就好了!

    上面那个function的定义改一下,给定一些默认值

    function uploadFile($fileInfo,$path="uploads",$allowExt=array('jpeg','jpg','png','tif'),$maxSize=10485760){

    这样子,简单是简单,但遇到一些问题。

    正常的上传4个图片是没问题,但要是中间激活了函数中的exit,就会立即停止,导致其他图片也无法上传。

    2 升级版封装

    旨在实现针对多个或单个文件上传的封装

    首先这样子写个静态文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="doAction5.php" method="post" enctype="multipart/form-data">
    请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
    请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
    请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
    请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
    <input type="submit" value="上传"/>
    </form>
    </body>
    </html>

    打印一下$_FILES

    Array
    (
        [myFile] => Array
            (
                [name] => Array
                    (
                        [0] => test32.png
                        [1] => test32.png
                        [2] => 333.png
                        [3] => test41.png
                    )
                [type] => Array
                    (
                        [0] => image/png
                        [1] => image/png
                        [2] => image/png
                        [3] => image/png
                    )
                [tmp_name] => Array
                    (
                        [0] => D:\wamp\tmp\php831C.tmp
                        [1] => D:\wamp\tmp\php834C.tmp
                        [2] => D:\wamp\tmp\php837C.tmp
                        [3] => D:\wamp\tmp\php83BB.tmp
                    )
                [error] => Array
                    (
                        [0] => 0
                        [1] => 0
                        [2] => 0
                        [3] => 0
                    )
                [size] => Array
                    (
                        [0] => 46174
                        [1] => 46174
                        [2] => 34196
                        [3] => 38514
                    )
            )
    )

    可以得到一个三维数组。

    复杂是复杂了,但复杂的有规律,各项数值都在一起了,很方便我们取值!!

    所以先得到文件信息,变成单文件处理那种信息

    function getFiles(){
        $i=0;
        foreach($_FILES as $file){
            if(is_string($file['name'])){  //单文件判定
                $files[$i]=$file;
                $i++;
            }elseif(is_array($file['name'])){
                foreach($file['name'] as $key=>$val){  //我的天,这个$key用的diao
                    $files[$i]['name']=$file['name'][$key];
                    $files[$i]['type']=$file['type'][$key];
                    $files[$i]['tmp_name']=$file['tmp_name'][$key];
                    $files[$i]['error']=$file['error'][$key];
                    $files[$i]['size']=$file['size'][$key];
                    $i++;
                }
            }
        }
        return $files;
        
    }

    然后之前的那种exit错误,就把exit改一下就好了,这里用res

    function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){
        //$flag=true;
        //$allowExt=array('jpeg','jpg','gif','png');
        //$maxSize=1048576;//1M
        //判断错误号
        $res=array();
        if($fileInfo['error']===UPLOAD_ERR_OK){
            //检测上传得到小
            if($fileInfo['size']>$maxSize){
                $res['mes']=$fileInfo['name'].'上传文件过大';
            }
            $ext=getExt($fileInfo['name']);
            //检测上传文件的文件类型
            if(!in_array($ext,$allowExt)){
                $res['mes']=$fileInfo['name'].'非法文件类型';
            }
            //检测是否是真实的图片类型
            if($flag){
                if(!getimagesize($fileInfo['tmp_name'])){
                    $res['mes']=$fileInfo['name'].'不是真实图片类型';
                }
            }
            //检测文件是否是通过HTTP POST上传上来的
            if(!is_uploaded_file($fileInfo['tmp_name'])){
                $res['mes']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的';
            }
            if($res) return $res;
            //$path='./uploads';
            if(!file_exists($path)){
                mkdir($path,0777,true);
                chmod($path,0777);
            }
            $uniName=getUniName();
            $destination=$path.'/'.$uniName.'.'.$ext;
            if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){
                $res['mes']=$fileInfo['name'].'文件移动失败';
            }
            $res['mes']=$fileInfo['name'].'上传成功';
            $res['dest']=$destination;
            return $res;
            
        }else{
            //匹配错误信息
            switch ($fileInfo ['error']) {
                case 1 :
                    $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
                    break;
                case 2 :
                    $res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小';
                    break;
                case 3 :
                    $res['mes'] = '文件部分被上传';
                    break;
                case 4 :
                    $res['mes'] = '没有选择上传文件';
                    break;
                case 6 :
                    $res['mes'] = '没有找到临时目录';
                    break;
                case 7 :
                case 8 :
                    $res['mes'] = '系统错误';
                    break;
            }
            return $res;
        }
    }

    里面封装了两个小的

    function getExt($filename){
        return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
    }
    /**
     * 产生唯一字符串
     * @return string
     */
    function getUniName(){
        return md5(uniqid(microtime(true),true));
    }

    然后静态中,用multiple属性实现多个文件的输入;

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="doAction6.php" method="POST" enctype="multipart/form-data">
    请选择您要上传的文件:<input type="file" name="myFile[]" multiple='multiple' /><br/>
    <input type="submit" value="上传"/>
    </form>
    </body>
    </html>
    <?php 
    //print_r($_FILES);
    header("content-type:text/html;charset=utf-8");
    require_once 'upFunc2.php';
    require_once 'common.func.php';
    $files=getFiles();
    // print_r($files);
    foreach($files as $fileInfo){
        $res=uploadFile($fileInfo);
        echo $res['mes'],'<br/>';
        $uploadFiles[]=@$res['dest'];
    }
    $uploadFiles=array_values(array_filter($uploadFiles));
    //print_r($uploadFiles);

    这样子的几个文件,就实现比较强大的面向过程的上传文件的功能。

    以上就是如何实现php多文件上传封装的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 封装 上传
    上一篇:php文件上传相关限制问题 下一篇:tp框架page类与bootstrap分页的实例详解
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 很好用的PHP数据库类_php实例• php编写批量生成不重复的卡号密码代码_PHP• php简单定时执行任务的实现方法_PHP• php时间戳格式化显示友好的时间函数分享_PHP• 鸡肋的PHP单例模式应用详解_PHP
    1/1

    PHP中文网