Blogger Information
Blog 31
fans 0
comment 0
visits 30282
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
小白浅析PHP中的单文件、多文件、批量上传
emy
Original
842 people have browsed it

一、文件上传的原理:

1、文件上传原理:将客户端的文件上传到服务器,再将服务器的临时文件上传到指定目录。

2、客户端配置:前端表单页面,提交表单的发送方式为post,添加enctype="multipart/form-data",且表单发送前的编码方式必须是二进制编码。当前端页面提交后,后端需要处理的,首先获得文件的后缀名,并对文件的存放位置进行设定。

3、服务器端配置:

file_uploads = On,支持HTTP上传uoload_tmp_dir = ,临时文件保存目录upload_max_filesize = 2M,允许上传文件的最大值max_file_uploads = 20 ,允许一次上传到的最大文件数post_max_size = 8M,post方式发送数据的最大值max_execution_time = -1,设置了脚本被解析器终止之前允许的最大执行时间,单位为秒,防止程序写的不好而占尽服务器资源。-1代表无穷max_input_time = 60 ,脚本解析输入数据允许的最大时间,单位为秒max_input_nesting_level = 64 ,设置输入变量的嵌套深度max_input_vars_ = 1000,接受多少输入的变量(限制分别应用于$_GET、$_POST和$_COOKIE超全局变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。memory_limit = 128M,最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义。

二、文件上传实例:

1-单文件上传:

<!-- 单个文件上传-->
    <form action="uploadFile.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="500000">
    <input type="file" name="myFile" /><input type="submit" value="上传文件"/>
    </form>

QQ截图20200515074641.jpg
QQ截图20200515074656.jpg
2-多文件上传:

<form action="uploadFile.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="3000000">
    <input type="file" name="myFile[]" /><br/>
    <input type="file" name="myFile[]" /><br/>
    <input type="submit" value="上传文件"/>
</form>

duo1.jpg

duowenjian.jpg

3-多文件批量上传:

<!-- 多文件(批量)上传-->
<form action="uploadFile.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="3000000">
    <input type="file" name="myFile[]" multiple="multiple"/><br/>
    <input type="submit" value="上传文件"/>
</form>

three.jpg

three2.jpg

4-upload.php文件

<?php
    header('Content-Type:text/html;charset=utf-8');
    //创建上传文件信息
    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){
                    $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;
    }
    //针对于单文件、多个单文件、多文件的上传 
    //默认上传保存的文件夹为本地的'uploadimg'文件夹,允许上传文件的大小最大为2M
    function uploadFile($fileInfo,$path='./uploadimg',$flag=true,$allowExt=array('jpeg','jpg','png','gif'),$maxSize=2097152){
        //判断错误号
        if($fileInfo['error']===UPLOAD_ERR_OK){
            //检测上传文件的大小
            if($fileInfo['size']>$maxSize){
                $res['wenjian']=$fileInfo['name'].'上传文件过大';
            }
            $ext=getExt($fileInfo['name']);
            //检测上传文件的文件类型
            if(!in_array($ext,$allowExt)){
                $res['wenjian']=$fileInfo['name'].'非法文件类型';
            }
            //检测是否是真实的图片类型
            if($flag){
                if(!getimagesize($fileInfo['tmp_name'])){
                    $res['wenjian']=$fileInfo['name'].'不是真实图片类型';
                }
            }
            //检测文件是否是通过HTTP POST上传上来的
            if(!is_uploaded_file($fileInfo['tmp_name'])){
                $res['wenjian']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的';
            }
            if( $res ) return $res; 
            //$path='./uploadimg';
            //如果没有这个文件夹,就创建
            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['wenjian']=$fileInfo['name'].'文件上传失败';
            }
            $res['wenjian']=$fileInfo['name'].'上传成功';
            $res['dest']=$destination;
            return $res;
        }else{
            //匹配错误信息
            switch($fileInfo['error']){
                case 1:
                    $res['wenjian'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
                    break;
                case 2:
                    $res['wenjian'] = '超过了HTML表单MAX_FILE_SIZE限制的大小';
                    break;
                case 3:
                    $res['wenjian'] = '文件部分被上传';
                    break;
                case 4:
                    $res['wenjian'] = '没有选择上传文件';
                    break;
                case 6:
                    $res['wenjian'] = '没有找到临时目录';
                    break;
                case 7:
                    $res['wenjian'] = '文件写入失败';
                    break;
                case 8:
                    $res['wenjian'] = '上传的文件被PHP扩展程序中断';
                    break;
            }
            return $res;
        }
    }
    //得到文件扩展名
    function getExt($filename){
        return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
    }
    //产生唯一字符串
    function getUniName(){
        return md5(uniqid(microtime(true),true));
    }
    ?>

5-uploadFile.php文件

<?php
    header("content-type:text/html;charset=utf-8");
    require_once 'upload.php';
    $files=getFiles();
    //修改上传目录,如没这个文件夹,就创建一个
    $filepath='uploadimg';
    //修改检查上传的文件是否为真实的图片。true:检查;'false':不要检查上传的文件是否为真实的图片
    //修改允许上传文件的类型,为('jpeg','jpg','png','gif','html','txt')
    $allowExt=array('jpeg','jpg','png','gif','html','txt');
    //上传大小限制
    $maxSize=2097152;
    foreach($files as $fileInfo){ $res=uploadFile($fileInfo,$filepath,$flag,$allowExt,$maxSize);
        echo $res['wenjian'],'<br/>';
        $uploadFiles[]=$res['dest'];
    }
    $uploadFiles=array_values(array_filter($uploadFiles));
    print_r($uploadFiles);//打印查看上传保存的结果
    ?>

三、总结:通过老师的源码和部分同学写的案例,了解了文件上传的大概流程和步骤,还没达到自己能敲出所有代码的阶段。做为小白,先从仿开始,做比不做强一点吧,更需要加倍努力学习。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:能坚持将视频看完, 案例做出来 , 非常不容易的, 因为这对于初学者是有难度的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post