PHP文件上传类实例详解


Posted in PHP onApril 08, 2016

本文实例讲述了PHP文件上传类。分享给大家供大家参考,具体如下:

这里演示了FileUpload.class.php文件上传类,其中用到了两个常量,可在网站配置文件中定义:

define('ROOT_PATH',dirname(__FILE__)); //网站根目录
define('UPDIR','/uploads/'); //上传主目录

具体代码如下:

<?php
  //上传文件类
  class FileUpload {
    private $error;  //错误代码
    private $maxsize; //表单最大值
    private $type;  //类型
    private $typeArr = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif'); //类型合集
    private $path;  //目录路径
    private $today;  //今天目录
    private $name;  //文件名
    private $tmp;  //临时文件
    private $linkpath; //链接路径
    private $linktotay; //今天目录(相对)
    //构造方法,初始化
    public function __construct($_file,$_maxsize) {
       $this->error = $_FILES[$_file]['error'];
       $this->maxsize = $_maxsize / 1024;
       $this->type = $_FILES[$_file]['type'];
       $this->path = ROOT_PATH.UPDIR;
       $this->linktotay = date('Ymd').'/';
       $this->today = $this->path.$this->linktotay;
       $this->name = $_FILES[$_file]['name'];
       $this->tmp = $_FILES[$_file]['tmp_name'];
       $this->checkError();
       $this->checkType();
       $this->checkPath();
       $this->moveUpload();
    }
    //返回路径
    public function getPath() {
       $_path = $_SERVER["SCRIPT_NAME"];
       $_dir = dirname(dirname($_path));
       if ($_dir == '\\') $_dir = '/';
       $this->linkpath = $_dir.$this->linkpath;
       return $this->linkpath;
    }
    //移动文件
    private function moveUpload() {
       if (is_uploaded_file($this->tmp)) {
         if (!move_uploaded_file($this->tmp,$this->setNewName())) {
            Tool::alertBack('警告:上传失败!');
         }
       } else {
         Tool::alertBack('警告:临时文件不存在!');
       }
    }
    //设置新文件名
    private function setNewName() {
       $_nameArr = explode('.',$this->name);
       $_postfix = $_nameArr[count($_nameArr)-1];
       $_newname = date('YmdHis').mt_rand(100,1000).'.'.$_postfix;
       $this->linkpath = UPDIR.$this->linktotay.$_newname;
       return $this->today.$_newname;
    }
    //验证目录
    private function checkPath() {
       if (!is_dir($this->path) || !is_writeable($this->path)) {
         if (!mkdir($this->path)) {
            Tool::alertBack('警告:主目录创建失败!');
         }
       }
       if (!is_dir($this->today) || !is_writeable($this->today)) {
         if (!mkdir($this->today)) {
            Tool::alertBack('警告:子目录创建失败!');
         }
       }
    }
    //验证类型
    private function checkType() {
       if (!in_array($this->type,$this->typeArr)) {
         Tool::alertBack('警告:不合法的上传类型!');
       }
    }
    //验证错误
    private function checkError() {
       if (!empty($this->error)) {
         switch ($this->error) {
            case 1 :
              Tool::alertBack('警告:上传值超过了约定最大值!');
              break;
            case 2 :
              Tool::alertBack('警告:上传值超过了'.$this->maxsize.'KB!');
              break;
            case 3 :
              Tool::alertBack('警告:只有部分文件被上传!');
              break;
            case 4 :
              Tool::alertBack('警告:没有任何文件被上传!');
              break;
            default:
              Tool::alertBack('警告:未知错误!');
         }
       }
    }
  }
?>

其中,用到了一个静态工具类 Tool.class.php,代码如下:

Tool.class.php

<?php
  class Tool {
     //弹窗返回
     static public function alertBack($_info) {
       echo "<script type='text/javascript'>alert('$_info');history.back();</script>";
       exit();
     }     //弹窗赋值关闭
     static public function alertOpenerClose($_info,$_path) {
       echo "<script type='text/javascript'>alert('$_info');</script>";
       echo "<script type='text/javascript'>opener.document.content.thumbnail.value='$_path';</script>";
       echo "<script type='text/javascript'>opener.document.content.pic.style.display='block';</script>";
       echo "<script type='text/javascript'>opener.document.content.pic.src='$_path';</script>";
       echo "<script type='text/javascript'>window.close();</script>";
       exit();
     } }
?>

下面进行一个实例演示,请看下面的步骤:

1、先创建一个 index.php 页面,做一个表单

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <title>main</title>
  </head>
  <body>
     <form name="content" method="post" action="?action=add">
     <input type="text" name="thumbnail" class="text" readonly="readonly" /> <input type="button" value="上传" onclick="centerWindow('./upfile.html','upfile','400','100')" /> <img name="pic" style="display:none;" /> ( * 必须是jpg,gif,png,并且200k内) <br />
     </form>
  </body>
</html>

2、创建 upfile.html 文件,建立表单提交到 upload.php

upfile.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>上传图片</title>
  </head>
  <body></p><p>   <form method="post" action="./upload.php" enctype="multipart/form-data" style="text-align:center;margin:30px;">
    <input type="hidden" name="MAX_FILE_SIZE" value="204800" />
    <input type="file" name="pic" />
    <input type="submit" name="send" value="确定上传" />
</form></p><p></body>
</html>

3、通过 upload.php 文件调用文件上传类实现上传,并且把路径赋给 input 标签和显示图片

<?php
  require 'FileUpload.class.php';
  if (isset($_POST['send'])) {
    $_fileupload = new FileUpload('pic',$_POST['MAX_FILE_SIZE']);
    $_path = $_fileupload->getPath();
    Tool::alertOpenerClose('文件上传成功!',$_path);
  } else {
    Tool::alertBack('警告:文件过大或者其他未知错误导致浏览器崩溃!');
  }
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
社区(php&amp;&amp;mysql)一
Oct 09 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
PHP读取数据库并按照中文名称进行排序实现代码
Jan 29 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
CI框架的安全性分析
May 18 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 #PHP
php生成带logo二维码方法小结
Apr 08 #PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 #PHP
PHP中__autoload和Smarty冲突的简单解决方法
Apr 08 #PHP
初识ThinkPHP控制器
Apr 07 #PHP
PHP中PDO的事务处理分析
Apr 07 #PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
Apr 07 #PHP
You might like
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
Vue.js实现立体计算器
2020/02/22 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
低版本中Python除法运算小技巧
2015/04/05 Python
Python多线程编程(一):threading模块综述
2015/04/05 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
Python构建图像分类识别器的方法
2019/01/12 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Python实现分数序列求和
2020/02/25 Python
pandas数据拼接的实现示例
2020/04/16 Python
Ibatis的核心配置文件都有什么
2014/09/08 面试题
NULL是什么,它是怎么定义的
2015/05/09 面试题
美术专业学生个人自我评价
2013/09/19 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
应届生找工作求职信
2014/06/24 职场文书
银行求职自荐信
2014/06/30 职场文书
党在我心中演讲稿
2014/09/02 职场文书
2014年营销工作总结
2014/11/22 职场文书
小学生节水倡议书
2015/04/29 职场文书
东京审判观后感
2015/06/01 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS