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 相关文章推荐
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
php懒人函数 自动添加数据
Jun 28 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
解析php 版获取重定向后的地址(代码)
Jun 26 PHP
php中apc缓存使用示例
Dec 25 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
深入浅出php socket编程
May 13 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 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
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
react-router实现按需加载
2017/05/09 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
python实现UDP协议下的文件传输
2020/03/20 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
经典c++面试题六
2012/01/18 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
升学宴主持词
2014/04/02 职场文书
伊琍体标语
2014/06/25 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python