PHP实现的文件上传类与用法详解


Posted in PHP onJuly 05, 2017

本文实例讲述了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" "<a target=_blank href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="external nofollow" rel="external nofollow" >http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>">
<html xmlns="<a target=_blank href="http://www.w3.org/1999/xhtml" rel="external nofollow" rel="external nofollow" >http://www.w3.org/1999/xhtml</a>">
  <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" "<a target=_blank href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="external nofollow" rel="external nofollow" >http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>">
<html xmlns="<a target=_blank href="http://www.w3.org/1999/xhtml" rel="external nofollow" rel="external nofollow" >http://www.w3.org/1999/xhtml</a>">
  <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下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
php array_filter除去数组中的空字符元素
Jun 21 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
php中的比较运算符详解
Oct 28 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
laravel通用化的CURD的实现
Dec 13 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 #PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 #PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 #PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 #PHP
PHP实现根据密码长度显示安全条
Jul 04 #PHP
PHP截取发动短信内容的方法
Jul 04 #PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 #PHP
You might like
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python入门教程之if语句的用法
2015/05/14 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
flask中的wtforms使用方法
2018/07/21 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
对python模块中多个类的用法详解
2019/01/10 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
关于python字符串方法分类详解
2019/08/20 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
python中的错误如何查看
2020/07/08 Python
python list的index()和find()的实现
2020/11/16 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
2014年群众路线党员自我评议
2014/09/24 职场文书
预备党员考察意见范文
2015/06/01 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
浅谈Python numpy创建空数组的问题
2021/05/25 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技