PHP实现单文件、多个单文件、多文件上传函数的封装示例


Posted in PHP onSeptember 02, 2019

本文实例讲述了PHP实现单文件、多个单文件、多文件上传函数的封装。分享给大家供大家参考,具体如下:

表单:

s.php

要在选择上传文件时能一次选择多个文件,那么就加multiple="multiple" ,还有注意下name="myFile1"name="myFile[]"的区别,单文件、多文件上传.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<form action="sss.php" method="post" enctype="multipart/form-data">
  <input type="file" name="myFile1" /><br/>
  <input type="file" name="myFile2" /><br/>
  <input type="file" name="myFile[]" /><br/>
  <input type="file" name="myFile[]" /><br/>
  <input type="file" name="myFile[]" multiple="multiple"/><br/>
  <input type="submit" value="上传文件"/>
</form>
</body>
</html>

上传函数的封装:

ss.php

<?php
header('Content-Type:text/html;charset=utf-8');
//构建上传文件信息
function getFiles(){
    $i=0;
    foreach($_FILES as $file){
        //因为这时$_FILES是个三维数组,并且上传单文件或多文件时,数组的第一维的类型不同,这样就可以拿来判断上传的是单文件还是多文件
        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;
}
//针对于单文件、多个单文件、多文件的上传
//默认允许上传的文件只为图片类型,并且只有这些图片类型:$allowExt=array('jpeg','jpg','png','gif');并且检查上传的文件是否为真实的图片$flag=true
//默认上传保存的文件夹为本地的'uploads'文件夹,允许上传文件的大小最大为2M
function uploadFile($fileInfo,$path='./uploads',$flag=true,$allowExt=array('jpeg','jpg','png','gif'),$maxSize=2097152){
    //判断错误号
    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; //如果要不显示错误信息的话,用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{
        //匹配错误信息
        //注意!错误信息没有5
        switch($fileInfo['error']){
            case 1:
                $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
                break;
            case 2:
                $res['mes'] = '超过了HTML表单MAX_FILE_SIZE限制的大小';
                break;
            case 3:
                $res['mes'] = '文件部分被上传';
                break;
            case 4:
                $res['mes'] = '没有选择上传文件';
                break;
            case 6:
                $res['mes'] = '没有找到临时目录';
                break;
            case 7:
                $res['mes'] = '文件写入失败';
                break;
            case 8:
                $res['mes'] = '上传的文件被PHP扩展程序中断';
                break;
        }
        return $res;
    }
}
?>

common.ss.php

<?php
//这两函数也可以一起放到ss.php里面去
//得到文件扩展名
function getExt($filename){
    return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
}
//产生唯一字符串
function getUniName(){
    return md5(uniqid(microtime(true),true));
}
?>

上传后文件的操作:

<?php
header("content-type:text/html;charset=utf-8");
require_once 'ss.php';
require_once 'common.ss.php';
$files=getFiles();
//修改允许上传文件的类型,为('jpeg','jpg','png','gif','html','txt'),也可以增加新的,如pdf,pptx等等
$allowExt=array('jpeg','jpg','png','gif','html','txt');
foreach($files as $fileInfo){
    //修改上传保存的文件夹为本地的'imooc',如果没有这个文件夹,那么就创建一个
    //'false'参数:不要检查上传的文件是否为真实的图片,因为要允许上传除开图片类型外的其他类型文件,如html、txt
    $res=uploadFile($fileInfo,'imooc',false,$allowExt);
    echo $res['mes'],'<br/>';
    $uploadFiles[]=$res['dest'];//如果要不显示错误信息的话,用@$uploadFiles[]=$res['dest'];
}
$uploadFiles=array_values(array_filter($uploadFiles));//这样便于保存到数据库
print_r($uploadFiles);//打印查看上传保存的结果
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
操作Oracle的php类
Oct 09 PHP
PHP下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
php实现根据字符串生成对应数组的方法
Sep 22 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP 文件上传限制问题
Sep 01 #PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 #PHP
php中的钩子理解及应用实例分析
Aug 30 #PHP
Yii框架分页技术实例分析
Aug 30 #PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 #PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 #PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 #PHP
You might like
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
jquery实现拖动效果
2016/08/10 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
详解Django中的过滤器
2015/07/16 Python
详解Django中的权限和组以及消息
2015/07/23 Python
Python3字符串学习教程
2015/08/20 Python
python读取excel表格生成erlang数据
2017/08/26 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python List cmp()知识点总结
2019/02/18 Python
Python安装whl文件过程图解
2020/02/18 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
文字自荐书范文
2014/02/10 职场文书
建筑学专业自荐书
2014/07/09 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
中学生自我评价2015
2015/03/03 职场文书
元旦主持词开场白
2015/05/29 职场文书