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编程开发“虚拟域名”系统
Oct 09 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
优化PHP代码技巧的小结
Jun 02 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
php的ajax简单实例
Feb 27 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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 minixml详解
2008/07/19 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
js精度溢出解决方案
2012/12/02 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
浅析vue数据绑定
2017/01/17 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python线程的两种编程方式
2015/04/14 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
Keras loss函数剖析
2020/07/06 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
庆祝儿童节标语
2014/10/09 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
表彰大会新闻稿
2015/07/17 职场文书
医院感染管理制度
2015/08/05 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python