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多线程抓取网页实现代码
Jul 22 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
PHP将XML转数组过程详解
Nov 13 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
PHP文件缓存类示例分享
Jan 30 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 PHP
Laravel框架下的Contracts契约详解
Mar 17 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
最省空间的计数器
2006/10/09 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
Thinkphp中数据按分类嵌套循环实现方法
2014/10/30 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
domReady的实现案例
2016/11/23 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
python数据结构之链表详解
2017/09/12 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python随机模块random使用方法详解
2020/02/14 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
什么是Python中的匿名函数
2020/06/02 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
医学院毕业生自荐信范文
2014/03/06 职场文书
2014年端午节活动方案
2014/03/11 职场文书
个人授权委托书范本
2014/04/03 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
运动会演讲稿50字
2014/08/25 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
详解Redis复制原理
2021/06/04 Redis