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的安全策略
Oct 09 PHP
五个PHP程序员工具
May 26 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
php分页思路以及在ZF中的使用
May 30 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
php Session存储到Redis的方法
Nov 04 PHP
PHP错误和异长常处理总结
Mar 06 PHP
php树型类实例
Dec 05 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
PDO::beginTransaction讲解
Jan 27 PHP
php+mysql开发中的经验与常识小结
Mar 25 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
文件系统基本操作类
2006/11/23 PHP
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
php验证是否是md5编码的简单代码
2014/04/01 PHP
php创建session的方法实例详解
2015/01/27 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
python文件比较示例分享
2014/01/10 Python
python读取图片任意范围区域
2019/01/23 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python hashlib模块实例使用详解
2019/12/24 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
python regex库实例用法总结
2021/01/03 Python
美国校园市场:OCM
2017/06/08 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
毕业生护理专业个人求职信范文
2014/01/04 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
代收款委托书范本
2014/10/01 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
维稳工作承诺书
2015/01/20 职场文书
springboot读取nacos配置文件
2022/05/20 Java/Android