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 相关文章推荐
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 PHP
谈谈PHP语法(2)
Oct 09 PHP
php桌面中心(一) 创建数据库
Mar 11 PHP
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
Symfony的安装和配置方法
Mar 17 PHP
php数组冒泡排序算法实例
May 06 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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 Mysql日期和时间函数集合
2007/11/16 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
python中int与str互转方法
2018/07/02 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
会计专业推荐信
2013/10/29 职场文书
化学教师教学反思
2014/01/17 职场文书
旅游项目开发策划书
2014/01/18 职场文书
会计求职信
2014/05/29 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
高二化学教学反思
2016/02/22 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
一条慢SQL语句引发的改造之路
2022/03/16 MySQL