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 相关文章推荐
echo, print, printf 和 sprintf 区别
Dec 06 PHP
PHPEXCEL 使用小记
Jan 06 PHP
php上传文件,创建递归目录的实例代码
Oct 18 PHP
Thinkphp中import的几个用法详细介绍
Jul 02 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
php遍历解析xml字符串的方法
May 05 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
php连接sftp的作用以及实例代码
Sep 23 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
消息持续发送的完整例子
2006/10/09 PHP
php array_search() 函数使用
2010/04/13 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
PHP防盗链代码实例
2014/08/27 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
Javascript Worker子线程代码实例
2020/02/20 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
python实现杨氏矩阵查找
2019/03/02 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
Python新手学习函数默认参数设置
2020/06/03 Python
Python调用C语言程序方法解析
2020/07/07 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
运动会广播稿400字
2014/01/25 职场文书
打架检讨书500字
2014/01/29 职场文书
中学生差生评语
2014/01/30 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers