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生成UTF8文件的方法
May 15 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
PHP中如何定义和使用常量
Feb 28 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
smarty缓存用法分析
Dec 16 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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的大小写敏感问题整理
2011/12/29 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
详解Vue整合axios的实例代码
2017/06/21 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python pandas生成时间列表
2019/06/29 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
一些网络技术方面的面试题
2014/05/01 面试题
文科生自我鉴定
2014/02/15 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
浅谈python数据类型及其操作
2021/05/25 Python