PHP单文件上传原理及上传函数的封装操作示例


Posted in PHP onSeptember 02, 2019

本文实例讲述了PHP单文件上传原理及上传函数的封装操作。分享给大家供大家参考,具体如下:

表单:

0.php:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<form action="000.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件<input type="file" name="myfile"/>
<input type="submit" value="上传文件"/>
</form>
</body>
</html>

单文件上传函数的封装:

00.php:

<?php
//单文件上传函数的封装
//文件上传原理:将客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定目录即可。
//文件的方向:客户端——>服务器(临时文件)——>指定目录,当文件进入服务器时它就是临时文件了,这时操作中要用临时文件的名称tmp_name。
//在客户端设置上传文件的限制(文件类型和大小)是不安全的,因为客户能通过源代码修改限制,所以在服务端这里设置限制。
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');
//通过$_FILES接收上传文件的信息
//$fileInfo = $_FILES['myFile'];
function uploadFile($fileInfo,$uploadPath='uploads',$flag=true,$allowExt=array('jpeg','jpg','png','gif'),$maxSize = 2097152){
//判断错误号,只有为0或者是UPLOAD_ERR_OK,没有错误发生,上传成功
    if($fileInfo['error']>0){
        //注意!错误信息没有5
        switch($fileInfo['error']){
            case 1:
                $mes= '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
                break;
            case 2:
                $mes= '超过了HTML表单MAX_FILE_SIZE限制的大小';
                break;
            case 3:
                $mes= '文件部分被上传';
                break;
            case 4:
                $mes= '没有选择上传文件';
                break;
            case 6:
                $mes= '没有找到临时目录';
                break;
            case 7:
                $mes= '文件写入失败';
                break;
            case 8:
                $mes= '上传的文件被PHP扩展程序中断';
                break;
        }
        exit($mes);
        return false;
    }
    $ext=pathinfo($fileInfo['name'],PATHINFO_EXTENSION);
    //$allowExt=array('jpeg','jpg','png','gif');
    //检测上传文件的类型
    if (! in_array ( $ext, $allowExt )) {
        exit ( '非法文件类型' );
    }
    //检测上传文的件大小是否符合规范
    //$maxSize = 2097152;//2M
    if($fileInfo['size']>$maxSize){
        exit('上传文件过大');
    }
    //检测图片是否为真实的图片类型
    //$flag=true;
    if($flag){
        if(!getimagesize($fileInfo['tmp_name'])){
            exit('不是真实的图片类型');
        }
    }
    //检测是否是通过HTTP POST方式上传上来
    if (! is_uploaded_file ( $fileInfo ['tmp_name'] )) {
        exit ( '文件不是通过HTTP POST方式上传上来的' );
    }
    //$uploadPath='uploads';
    //如果没有这个文件夹,那么就创建一个
    if(!file_exists($uploadPath)){
        mkdir( $uploadPath, 0777, true);
        chmod( $uploadPath, 0777 );
    }
    //新文件名唯一
    $uniName = md5 ( uniqid( microtime(true),true) ).'.'.$ext;
    $destination = $uploadPath.'/'.$uniName;
    //@符号是为了不让客户看到错误信息
    if(! @move_uploaded_file($fileInfo['tmp_name'], $destination )){
        exit('文件移动失败');
    }
    //echo '文件上传成功';
    //return array(
    //    'newName'=>$destination,
    //    'size'=>$fileInfo['size'],
    //    'type'=>$fileInfo['type']
    //);
    return $destination;
}
?>

服务端操作上传的文件:

000.php

<?php
header('content-type:text/html;charset=utf-8');
include_once '00.php';
$fileInfo=$_FILES['myfile'];
$allowExt=array('jpeg','jpg','png','gif','html','txt');//修改允许上传文件的类型,为('jpeg','jpg','png','gif','html','txt'),也可以增加新的,如pdf,pptx等等
$newName=uploadFile($fileInfo,'imooc',false,$allowExt);//修改上传保存的文件夹为本地的'imooc',如果没有这个文件夹,那么就创建一个;//'false'参数:不要检查上传的文件是否为真实的图片,因为要允许上传除开图片类型外的其他类型文件,如html、txt
echo $newName;
?>

最后,PHP的文件上传还有更智能的,功能更健全的  PHP单文件、多个单文件、多文件上传函数的封装

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP令牌 Token改进版
Jul 18 PHP
php中的数组操作函数整理
Aug 18 PHP
PHP之COOKIE支持详解
Sep 20 PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 PHP
PHP实现的MongoDB数据库操作类分享
May 12 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
PHP文件操作详解
Dec 30 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 PHP
PHP抽象类基本用法示例
Dec 28 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 #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
You might like
NO3第三帝国留言簿制作过程
2006/10/09 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
PHP 类与构造函数解析
2017/02/06 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
javascript 写类方式之五
2009/07/05 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
python调用接口的4种方式代码实例
2019/11/19 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
Python ellipsis 的用法详解
2020/11/20 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
办公室文员工作自我评价
2013/12/01 职场文书
写给老师的表扬信
2014/01/21 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
关于运动会的稿件
2014/02/02 职场文书
软件测试专业推荐信
2014/09/18 职场文书
员工教育培训协议书
2014/09/27 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
校本研修个人总结
2015/02/28 职场文书
春季运动会加油词
2015/07/18 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
Python获取字典中某个key的value
2022/04/13 Python