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中for循环语句的几种变型
Nov 26 PHP
PHP安全配置
Dec 06 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 PHP
php利用cookie实现访问次数统计代码
May 19 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
PHP中使用array函数新建一个数组
Nov 19 PHP
PHP实现文件上传下载实例
Oct 18 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
解决laravel查询构造器中的别名问题
Oct 17 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
详解php中流行的rpc框架
May 29 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
php Static关键字实用方法
2010/06/04 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
8个PHP数组面试题
2015/06/23 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
python原始套接字编程示例分享
2014/02/21 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
python实现朴素贝叶斯算法
2018/11/19 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
linux面试题参考答案(4)
2014/09/21 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
医院合作意向书范本
2015/05/08 职场文书
刑事申诉状范文
2015/05/20 职场文书
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL
德生2P3收音机开箱评测
2022/04/30 无线电