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 相关文章推荐
批量修改RAR文件注释的php代码
Nov 20 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
PHP间隔一段时间执行代码的方法
Dec 02 PHP
php把大写命名转换成下划线分割命名
Apr 27 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php 静态变量的初始化
2009/11/15 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
Python多进程编程技术实例分析
2014/09/16 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Python中函数的返回值示例浅析
2019/08/28 Python
Django之form组件自动校验数据实现
2020/01/14 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
python lambda的使用详解
2021/02/26 Python
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
JPA的特点
2014/10/25 面试题
乡镇组织委员个人整改措施
2014/09/16 职场文书
2014年实习期工作总结
2014/11/27 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
五年级学生期末评语
2014/12/26 职场文书
学术会议邀请函
2015/01/30 职场文书
暑期实践个人总结
2015/03/06 职场文书
居安思危观后感
2015/06/11 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书