PHP三种方法实现多文件上传

今天一个网介绍三种多文件上传的方法,前两种都是直接遍历三维超全局数组$_FILES,最后一种是先定义一个单文件上传函数,再循环调用该函数,完成多文件的上传。

方法一:当多文件上传表单中多个上传文件的name属性为“pic[]”形式时,也即表单为这种形式。

HTML代码:

<form action="" method="post"enctype="multipart/form-data">
<input type="hidden"name="MAX_FILE_SIZE" value="">
<input type="file" name="pic[]" /><br><br>
<input type="file" name="pic[]" /><br><br>
<input type="file" name="pic[]" /><br><br>
<input type="file" name="pic[]" /><br><br>
<input type="submit" value="upload"/>

</form>

PHP代码:

<?php

//1.获取要上传文件的信息
$up_info=$_FILES[‘pic‘];
$ob_path="../system";

$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定义运行的上传文件类型
for($i=0;$i<count($up_info[‘name‘]);$i++){ //foreach 循环处理多个文件上传
    //2.判断文件是否上传错误
    if($up_info[‘error‘][$i]>0){
        switch($up_info[‘error‘][$i]){
            case 1:
                $err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制值";
                break;
            case 2:
                $err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
                break;
            case 3:
                $err_info="文件只有部分被上传";
                break;
            case 4:
                $err_info="没有文件被上传";
                break;
            case 6:
                $err_info="找不到临时文件夹";
                break;
            case 7:
                $err_info="文件写入失败";
                break;
            default:
                $err_info="未知的上传错误";
                break;
        }

        continue($err_info);
    }
    //3.判断文件上传的类型是否合法

    if(!in_array($up_info[‘type‘][$i],$typelist)){
        continue(‘文件类型错误!‘.$up_info[‘type‘][$i]);
    }
    //4.上传文件的大小过滤
    if($up_info[‘size‘][$i]>1000000){
        continue(‘文件大小超过1000000‘);
    }

    //5.上传文件名处理
    $exten_name=pathinfo($up_info[‘name‘][$i],PATHINFO_EXTENSION);
    do{
        $main_name=date(‘YmHis‘.‘--‘.rand(100,999));
        $new_name=$main_name.‘.‘.$exten_name;
    }while(file_exists($to_path.‘/‘.$new_name));
    //6.判断是否是上传的文件,并执行上传
    if(is_uploaded_file($up_info[‘tmp_name‘][$i])){
        if(move_uploaded_file($up_info[‘tmp_name‘][$i],$ob_path.‘/‘.$new_name)){
            echo ‘文件上传成功!‘;
        }else{
            echo ‘上传文件移动失败!‘;
        }
    }else{
        echo ‘文件不是上传的文件‘;
    }
} //for循环的括号

方法二:当多文件上传表单中多个上传文件的name属性为“pic,text,doc,pdf”形式时

也即表单为这种形式:

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="">
<input type="file" name="pic" /><br><br>
<input type="file" name="text" /><br><br>
<input type="file" name="doc" /><br><br>
<input type="file" name="pdf" /><br><br>
<input type="submit" value="upload"/>
</form>

//1.获取要上传文件的信息
$up_info=$_FILES;

$ob_path="..\system";

$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定义运行的上传文件类型
foreach($up_info as $k_name=>$value){ //用foreach循环 处理多个文件的上传
    //2.判断文件是否上传错误

    if($up_info[$k_name][‘error‘]>0){
        switch($up_info[‘error‘][$i]){
            case 1:
                $err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
                break;
            case 2:
                $err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
                break;
            case 3:
                $err_info="文件只有部分被上传";
                break;
            case 4:
                $err_info="没有文件被上传";
                break;
            case 6:
                $err_info="找不到临时文件夹";
                break;
            case 7:
                $err_info="文件写入失败";
                break;
            default:
                $err_info="未知的上传错误";
                break;
        }
        continue($err_info);

    }
    //3.判断文件上传的类型是否合法

    if(!in_array($up_info[$k_name][‘type‘],$typelist)){
        continue(‘文件类型错误!‘.$up_info[$k_name][‘type‘]);
    }

    //4.上传文件的大小过滤

    if($up_info[$k_name][‘size‘]>100000){
        echo ‘文件大小超过**‘;
        continue;

    }

    //5.上传文件名处理
    $exten_name=pathinfo($up_info[$k_name][‘name‘],PATHINFO_EXTENSION);
    do{
        $main_name=date(‘YmHis‘.‘--‘.rand(100,999));

        $new_name=$main_name.‘.‘.$exten_name;
    }while(file_exists($to_path.‘/‘.$new_name));
    //6.判断是否是上传的文件,并执行上传

    if(is_uploaded_file($up_info[$k_name][‘tmp_name‘])){
        if(move_uploaded_file($up_info[$k_name][‘tmp_name‘],$ob_path.‘/‘.$new_name)){
            echo ‘文件上传成功!‘;
        }else{
            echo ‘上传文件移动失败!‘;
        }
    }else{
        echo ‘文件不是上传的文件‘;

    }
} //for循环的括号

方法三:先定义单个文件上传的函数,再循环调用这个函数,每次传入一个文件的上传信息,也可以到达多文件上传的目的,而且这种方式,更容易理解。

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="">
<input type="file" name="pic1" ><br>
<input type="file" name="pic2"><br>
<input type="file" name="pic3"><br>
<input type="submit" value="upload">

</form>
/*
*单文件上传函数
*@param array $up_info 记录上传文件信息的超全局数组
*@param string $to_path 上传文件的目标路径
*@param array $typlist 允许的文件类型
*@param int $file_size允许的文件大小
*@return string 上传失败,返回失败的原因
* http://yige.org/php/
* 成功返回包括文件名的路径。
*/
function upload_fun($up_info,$to_path,$typelist=array(),$file_size=2000000){
    //1.判断文件上传是否错误

    if($up_file[‘error‘]>0){
        switch($up_info[‘error‘]){
            case 1:
                $err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
                break;
            case 2:
                $err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
                break;
            case 3:
                $err_info="文件只有部分被上传";
                break;
            case 4:
                $err_info="没有文件被上传";
                break;
            case 6:
                $err_info="找不到临时文件夹";
                break;
            case 7:
                $err_info="文件写入失败";
                break;

            default:
                $err_info="未知的上传错误";
                break;
        }
        return $err_info;

        die();
    }
    //2.判断上传文件类型是否合法
    if(count($typelist)>0){
        if(!in_array($up_info[‘type‘],$typelist)){
            $err_info=‘文件类型不合法!‘.$up_info[‘type‘];
            return $err_info;
            die();
        }
    }

    //4.判断上传文件大小是否超出允许值

    if($up_info[‘size‘]>$file_size){
        return $err_info=‘文件大小超过‘.$file_size;

        die();

    }

    //5.上传文件重命名

    $exten_name=pathinfo($up_info[‘name‘],PATHINFO_EXTENSION);

    do{
        $main_name=date(‘YmHis‘.‘--‘.rand(100,999));
        $new_name=$main_name.‘.‘.$exten_name;

    }while(file_exists($to_path.‘/‘.$new_name));

    //6.判断是否是上传的文件,并移动文件

    if(is_uploaded_file($up_info[‘tmp_name‘])){
        if(move_uploaded_file($up_info[‘tmp_name‘],$to_path.‘/‘.$new_name)){
            $err_info=$to_path.‘/‘.$new_name;
            return $err_info;
            die();
        }else{
            return $err_info=‘上传文件移动失败!‘;

            die();

        }
    }else{
        return $err_info=‘这个文件不是上传文件!‘;
        die();

    }

}

//函数使用方法如下
$multi_info=$_FILES; //接收$_FILES的全部上传信息
$to_path=‘system‘; //上传文件的目标路径

foreach($multi_info as $name=>$up_info){ //foreach 遍历$multi_info

    $err_info=upload_fun($up_info,$to_path); //调用单文件上传函数
    p($err_info); //输出返回信息;

}

本文转自  http://yige.org/p/492

时间: 2024-11-11 20:43:53

PHP三种方法实现多文件上传的相关文章

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 1 <%@ page language="jav

springMVC两种方式实现多文件上传及效率比较

springMVC实现 多文件上传的方式有两种,一种是我们经常使用的以字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传.这两种方式对于实 现多文件上传效率上却有着很大的差距,下面我们通过实例来看一下这两种方式的实现方式,同时比较一下在效率上到底存在着多大的差距. 1.下载相关jar包. 需要引入的jar出了springMVC的jar包外,还需要引入 com.springsource.org.apache.commons.fileupload-1.2.0.jar和

struts2之限制文件上传类型

FileUploadInterceptor中定义了setAllowedExtensions(String)和setAllowedTypes(String)两种方法来限制文件上传类型 1.setAllowedExtensions(String)设置允许上传的文件后缀名, setAllowedTypes(String)设置了允许上传文件的类型,推荐使用setAllowedTypes(String). 因为如果使用setAllowedExtensions(String)用户将文件后缀修改成允许上传的后

本地文件上传到Linux服务器的几种方法

本文介绍几种常见的方法,把文件上传到Linux服务器中! 常见有使用:scp命令.xshell软件里的xftp程序.U盘挂载.服务器自带的lrzsz程序. 一.scp使用说明: 1.把本机的文件传给目的服务器: scp get66.pcap [email protected]:/super 备注:把本机get66.pcap拷贝到147这台服务器的super目录下,需要提供147的密码 2.在本机上执行scp,把远端的服务器文件拷贝到本机上: scp [email protected]:/supe

文件上传到tomcat服务器 commons-fileupload的详细介绍与使用

三个类:DiskFileUpload.FileItem和FileUploadException.这三个类全部位于org.apache.commons.fileupload包中. 首先需要说明一下form表格的enctpye的属性: 表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码.默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传:只有使用了multipart/form-data,

Struts2 单个文件上传/多文件上传

1导入struts2-blank.war所有jar包:\struts-2.3.4\apps\struts2-blank.war 单个文件上传 upload.jsp <s:form action="upload2.action" method="post" theme="simple" enctype="multipart/form-data"> <tr> <td id="more&quo

struts(八)文件上传

文件上传简述 struts2的文件上传没有使用Servlet 3.0 API,所以struts2的文件上传还需要依赖于Common-FileUpload.COS等文件上传组件. 为了能上传文件,必须将表单的method设置为POST,将enctype设置为multipart/form-data,需添加 < input type="file"> 字段.这样,浏览器才会把用户选择文件的二进制数据发送给服务器. 设置了enctype为multipart/form-data,浏览器

Struts2单文件上传

第一步:首先写个上传文件的页面(简单的一个form表单) <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传</title> </head> <body> <h1>文件上传</h1> <br><br>

iOS开发AFN使用二:AFN文件下载与文件上传

#import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self download]; } -(void)download