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 相关文章推荐
DISCUZ 论坛管理员密码忘记的解决方法
May 14 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
Jan 14 PHP
ThinkPHP模型详解
Jul 27 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
详解WordPress中给链接添加查询字符串的方法
Dec 18 PHP
详解PHP数据压缩、加解密(pack, unpack)
Dec 17 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
Jul 26 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
8个必备的PHP功能开发
2015/10/02 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
Python subprocess模块详细解读
2018/01/29 Python
python实现最大优先队列
2019/08/29 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
某同学的自我鉴定范文
2013/12/26 职场文书
土木工程专业推荐信
2014/02/19 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
一份文言文检讨书
2014/09/13 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
Go语言入门exec的基本使用
2022/05/20 Golang