php示例功能-上传类

上传类-$_FILE变量
上传表单的设置以及超级全局变量$_FILE
一.上传表单
1.上传表单和普通表单设置不通
创建上传表单1.php

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>上传</title>
</head>
<body>
<form action="2.php" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="204800">
    上传图片:<input type="file" name="pic"> <button type="submit">上传</button>
</form>
</body>
</html>

在这里:
(1)enctype表示提交的编码方式,multipart/form-data表示不对字符编码,使用上传功能必须使用这个参数
(2)隐藏字段中name="MAX_FILE_SIZE",强制上传文件的大小,单位是字节,value="204800"表示不能超过200kb,这个是软限制,级别略低
(3)在php.ini中有一个upload_max_filesize给出了文件上传的大小,默认是2M,这个是硬性限制,级别高,软限制高于硬限制会被自动忽略
二.$_FILE变量
1.选择一张图片作为上传基质,通过print_r输出结果
创建获取上传对象2.php

<?php

print_r($_FILES);

选择一张图片1.png通过1.php上传查看图片信息
Array
(
    [pic] => Array
        (
            [name] => 1.png
            [type] => image/png
            [tmp_name] => E:\Program\tmp\php90D0.tmp
            [error] => 0
            [size] => 82974
        )

)
在这里:
(1)name表示文件原来的名称和后缀
(2)type表示文件类型,如果是图片,则有以下几种:
a)image/jpeg
b)image/pjpeg
c)image/png
d)image/x-png
e)image/gif
(3)tmp_name上传文件的临时名称,如果上传文件是一个很大的文件,将会返回一个none
(4)size表示上传文字的大小,单位为字节。如果上传一个很大的文件,将会返回0
三.检测并保存
1.使用is_uploaded_file函数判断是否上传成功
2.使用move_uploaded_file函数移动到指定目录
接收表单2.php

<?php
//判断文件是否上传成功
if (is_uploaded_file($_FILES['pic']['tmp_name'])) {
    echo '上传成功';
    //移动到指定目录内,并修改名称
    if (move_uploaded_file($_FILES['pic']['tmp_name'], '123.png')) {
        echo '文件已经拷贝到指定目录,临时文件将被删除';
    }
}

PS1:函数会检测文件是否已经上传到临时空间,如果成功则反回真
PS2:函数会检测是否是一个上传文件,当执行完毕后,临时文件会移动到指定的目录,并删除临时文件

上传类-创建类之错误和类别,目录和路径
创建上传表单1.php并

<?php
   echo __DIR__;
?>
<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>上传</title>
</head>
<body>
<form action="3.php" enctype="multipart/form-data" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="204800">
    上传图片:<input type="file" name="pic"> <button type="submit">上传</button>
</form>
</body>
</html>

创建获取上传对象3.php

<?php
require 'upload.php';

if (isset($_FILES['pic'])) {
    //获取上传对象
    $file = Upload::getUpload('pic',204800);
    //输出上传的图片地址
    echo $file->getPath();

} else {
    exit('警告:文件太大或未知错误');
}

创建图片上传类upload.php

 

<?php
//上传类(图片)
class Upload
{
    //上传文件名
    private $name;

    //上传的临时文件
    private $tmp;

    //上传的错误编号
    private $error;

    //上传的类型
    private $type;

    //上传的类型列表
    private $typeList;

    //表单限制文件的大小
    private $maxSize;

    //上传文件目录(硬盘目录)
    private $dir;

    //上传的文件路径
    private $path;

    //今天的日期
    private $today;

    //构造方法
    public function __construct($param, $maxSize)
    {
        //获取原来文件名字
        $this->name       =       $_FILES[$param]['name'];
        //获取临时文件
        $this->tmp        =       $_FILES[$param]['tmp_name'];
        //获取错误编号
        $this->error      =       $_FILES[$param]['error'];
        //获取文件类型
        $this->type       =       $_FILES[$param]['type'];
        //设置文件类型列表
        $this->typeList   =       array(
                                   'image/jpeg',
                                   'image/png',
                                   'image/gif',
                                   'image/x-png',
                                   'image/pjpeg'
        );
        //限制文件的大小
        $this->maxSize    =       $maxSize / 1024;
        //今天的日期
        $this->today      =        date('y-m-d');
        //设置上传目录,具体目录可以做成配置文件常量
        $this->dir        =        __DIR__.'\\'.$this->today.'\\';
        //判断文件错误编号
        $this->checkError();
        //判断文件类型
        $this->checkType();
        //设置上传目录
        $this->setDir();
        //保存文件
        $this->setFile();
    }

    //内部自我实现实例化,静态方法
    public static function getUpload($param, $maxSize)
    {
        return new self($param, $maxSize);
    }

    //判断文件错误编号
    private function checkError()
    {
        //当错误代码不为零时,发生错误
        if (!empty($this->error)) {
            //依次判断
            switch ($this->error) {
                case 1:
                     exit('警告:文件大小超过了约定值!');
                     break;
                case 2:
                     exit('警告:文件大小超过了'.$this->maxSize.'KB');
                     break;
                case 3:
                     exit('警告:文件没有完全上传!');
                     break;
                case 4:
                      exit('警告:没有文件上传!');
                      break;
                default :
                       exit('警告:未知错误!');
            }

        }
    }

    //判断文件类型
    private function checkType()
    {
        if (!in_array($this->type, $this->typeList)) {
            exit('警告:文件类型不合法!');
        }
    }

    //设置上传目录
    private function setDir()
    {
        //判断指定的目录是否存在
        if (!is_dir($this->dir)) {
            //不存在则创建这个目录
            if (!mkdir($this->dir)) {
                exit('警告:目录创建失败!');
            }
        }
    }

    //设置上传后的文件名
    private function setName()
    {
        //得到文件名后缀
         $postFix      =     explode('.', $this->name)[1];
         //生成文件名
         $name         =      md5(time().mt_rand(1,100)).'.'.$postFix;
         //设置新文件目录的地址
         $this->path   =      $this->today.'/'.$name;
         //设置新文件目录地址
         return $this->dir.$name;
    }

    //保存文件
    private function setFile()
    {
        //判断文件是否上传成功
        if (is_uploaded_file($this->tmp)) {
            //移动到指定目录内,并修改名称
            if (!move_uploaded_file($this->tmp, $this->setName())) {
                exit('警告:保存失败');
            }
        } else {
            exit('警告:上传失败!');
        }
    }

    //获取图片地址
    public function getPath()
    {
        return $this->path;
    }
}

 

posted on 2018-03-13 15:50  我不是西西  阅读(175)  评论(0)    收藏  举报