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 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
php生成年月日下载列表的方法
Apr 24 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
thinkphp5使用无限极分类
Feb 18 PHP
PHP实现随机发放扑克牌
Apr 21 PHP
PHP变量的作用范围实例讲解
Dec 22 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引用返回与取消引用的详解
2013/06/08 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
js分页代码分享
2014/04/28 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
详解JavaScript中的六种错误类型
2017/09/21 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
详解React中setState回调函数
2018/06/14 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
CentOS安装pillow报错的解决方法
2016/01/27 Python
windows下python连接oracle数据库
2017/06/07 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
tensorflow 查看梯度方式
2020/02/04 Python
Python 远程开关机的方法
2020/11/18 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
建筑班组长岗位职责
2014/01/02 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
股东合作协议书范本
2014/04/14 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
利用Redis实现点赞功能的示例代码
2022/06/28 Redis