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 相关文章推荐
让你同时上传 1000 个文件 (一)
Oct 09 PHP
php自动适应范围的分页代码
Aug 05 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
destoon后台网站设置变成空白的解决方法
Jun 21 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
php实现阳历阴历互转的方法
Oct 28 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
Laravel 实现数据软删除功能
Aug 21 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 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
德劲1104的电路分析与改良
2021/03/01 无线电
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
php实现两个数组相加的方法
2015/02/17 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
Safari5中alert的无限循环BUG
2011/04/07 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python之循环结构
2019/01/15 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
python线程信号量semaphore使用解析
2019/11/30 Python
Python对wav文件的重采样实例
2020/02/25 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
Python 多进程原理及实现
2020/12/21 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
化工专业应届生求职信
2013/11/08 职场文书
大三学生入党思想汇报
2014/01/02 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS