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 相关文章推荐
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
php str_replace的替换漏洞
Mar 15 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
php以post形式发送xml的方法
Nov 04 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
PHP curl使用实例
Jul 02 PHP
PHP邮箱验证示例教程
Jun 01 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
php连接mysql数据库最简单的实现方法
Sep 24 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中const与define的应用区别
2013/06/18 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
Javascript 刷新全集常用代码
2009/11/22 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
Ext 今日学习总结
2010/09/19 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
Django接受前端数据的几种方法总结
2016/11/04 Python
python中kmeans聚类实现代码
2018/02/23 Python
python-str,list,set间的转换实例
2018/06/27 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python安装gdal的两种方法
2019/10/29 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
Python 图片处理库exifread详解
2021/02/25 Python
德国帽子专家:Hutshopping
2019/11/03 全球购物
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
主题实践活动总结
2014/05/08 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书