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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续四
Apr 03 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
is_uploaded_file函数引发的不能上传文件问题
Oct 29 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
php写app接口并返回json数据的实例(分享)
May 20 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
php正确输出json数据的实例讲解
Aug 21 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
JSON Web Tokens的实现原理
2017/04/02 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
25道Java面试题集合
2013/05/21 面试题
历史学专业求职信
2014/06/19 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
56句经典英文座右铭
2019/08/09 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android