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和ACCESS写聊天室(六)
Oct 09 PHP
推荐php模板技术[转]
Jan 04 PHP
PHP5.3.1 不再支持ISAPI
Jan 08 PHP
PHP 加密解密内部算法
Apr 22 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
php实现encode64编码类实例
Mar 24 PHP
php实现插入排序
Mar 29 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
php与阿里云短信接口接入操作案例分析
May 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
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
php生成微信红包数组的方法
2019/09/05 PHP
JS与C#编码解码
2013/12/03 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
对python自动生成接口测试的示例讲解
2018/11/30 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
医学生求职自荐信
2013/10/25 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
领导班子对照检查材料
2014/09/22 职场文书
起诉状范本
2015/05/20 职场文书
班级联欢会主持词
2015/07/03 职场文书
庆祝教师节主持词
2015/07/06 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python