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 相关文章推荐
PHP5在Apache下的两种模式的安装
Sep 05 PHP
计算2000年01月01日起到指定日的天数
Oct 09 PHP
php学习之流程控制实现代码
Jun 09 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
自编函数解决pathinfo()函数处理中文问题
Nov 03 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
项目中应用Redis+Php的场景
May 22 PHP
PHP身份证校验码计算方法
Aug 10 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
vmware linux系统安装最新的php7图解
Apr 14 PHP
laravel-admin select框默认选中的方法
Oct 03 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 组件化编程技巧
2009/06/06 PHP
PHP代码优化的53个细节
2014/03/03 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
javascript中的一些注意事项 更新中
2010/12/06 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
json数据的列循环示例
2013/09/06 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
Vuex简单入门
2017/04/19 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
python中stdout输出不缓存的设置方法
2014/05/29 Python
Python selenium 三种等待方式解读
2016/09/15 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
python中abs&amp;map&amp;reduce简介
2018/02/20 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
学校介绍信范文
2014/01/14 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
体育运动会广播稿
2014/10/05 职场文书
怎样写家长意见
2015/06/04 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书