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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
Jul 19 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
smarty自定义函数用法示例
May 20 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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
php文件上传的两种实现方法
2016/04/04 PHP
微信支付开发维权通知实例
2016/07/12 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python如何通过protobuf实现rpc
2016/03/06 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python http接口自动化脚本详解
2018/01/02 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
经典C++面试题一
2016/11/06 面试题
什么是GWT的Module
2013/01/20 面试题
创建服务型党组织实施方案
2014/02/25 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
2014年学生会工作总结
2014/11/07 职场文书
交通事故和解协议书
2015/01/27 职场文书
2014年度个人总结范文
2015/03/09 职场文书
地球上的星星观后感
2015/06/02 职场文书
小学数学新课改心得体会
2016/01/22 职场文书