博客列表 >文件上传和单例模式

文件上传和单例模式

LIWEN的博客
LIWEN的博客原创
2018年01月15日 15:45:22863浏览

一、文件上传功能的实现:

(一)、准备工作,对php.ini文件进行设置
* 1、file_uploads = on 开启文件上传功能
*2、max_file_uploads 大致意思为:一个表单最多只能上传多少个附件
* 3、upload_tmp_dir 设置临时目录
* 4、upload_max_filesize 设置上传文件的最大大小
* (二)、$_FILES函数 和 move_uploaded_file() 函数
* 1、$_FILES函数:当客户端提交后,我们获得了一个$_FILES 数组,
* $_FILES数组内容如下:
* $_FILES['myFile']['name'] 客户端文件的原名称。
* $_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
* $_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
* $_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
* $_FILES['myFile']['error'] 和该文件上传相关的错误代码。
* 2、move_uploaded_file() 函数:将上传的文件移动到新位置,若成功,则返回 true,否则返回 false。
* 语法:move_uploaded_file(file,newloc) :file,必需,规定要移动的文件。newloc,必需,规定文件的新位置。

代码如下:

<?php
/**
 * 文件上传
 */
error_reporting(E_ALL ^ E_NOTICE);  //不显示notice信息
//第一步:上传文件
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
 //检查一下文件是否要上传
 if (isset($_FILES['upload'])) {
 //设置允许上传的文件类型
 $allowed = ['image/jpeg','image/JPG','image/X-PNG','image/PNG','image/x-png','image/gif'];
 //检查要上传的文件,在不在这个列表中
 if (in_array($_FILES['upload']['type'],$allowed)){
 //将文件存入到临时文件夹中,并进行判断
 $tmpFile = $_FILES['upload']['tmp_name'];
 if (move_uploaded_file($tmpFile,__DIR__.'/uploads'.$_FILES['upload']['name'])){
 echo '<h3>上传成功</h3>';
            }else{
 echo '<h3>上传失败</h3>';
            }
        }
    }
}
//第二步:输出错误信息
//检测上传过程中的错误,$_FIFLES['upload']['error'] == 0 ,没有错误,只要大于0则输出错误信息
if ($_FILES['upload']['error'] > 0){
 switch ($_FILES['upload']['error']){
 case 1:
 print '文件超过了php.ini规定的大小';
 break;
 case 2:
 print '文件超过了表单规定的大小';
 break;
 case 3:
 print '文件只上传了一部分';
 break;
 default:
 print '文件只上传了一部分';
 break;
    }
}

//第三步:删除临时文件
if (file_exists($tmpFile) && is_file($tmpFile)){
 unlink($tmpFile);
}
?>
<!--1、form标签必须设置:enctype="multipart/form-data",固定写法。-->
<!--2、input的类型必须是file,并且推荐前面添加隐藏域,设置一下允许上传的文件大小。-->
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<h3>文件上传</h3>
<form action="" method="post" enctype="multipart/form-data">
<!--    添加一个隐藏域,限制文件大小-->
 <div><input type="hidden" name="MAX_FILE_SIZE" value="100000"></div>
    <div><input type="file" name="upload"></div>
    <div><input type="submit" value="上传"></div>
</form>
</body>
</html>

二、单例模式

单例模式确保某一个类只有一个实例,单例类不能在其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,不能被克隆,而是会向单例类内部存储的实例返回一个引用。

单例模式至少拥有以下三种公共元素:
1. 它们必须拥有一个私有的构造函数:private function __construct(){}
2. 它们拥有一个保存类的实例的静态成员变量,如:private static $instance
3. 它们拥有一个访问这个实例的公共的静态方法,如:public static function getInstance(){}

代码如下:

<?php
/**
 * 单例模式:一个类只允许实例化一次
 */
class Demo
{
    private static $instance = null;  //创建一个私有静态属性,用于在创建实例和类外调用
    //把构造方法私有化
    private function __construct()
    {
    }
    //禁止克隆
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }
    //生成当前类的唯一实例
    public static function getInstance()
    {
        //判断当前的$instance 是不是当前类的实例,如果不是,则new一个实例
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        //如果是当前类的实例,则返回当前类的instance实例
        return self::$instance;
    }
}
$obj1 = Demo::getInstance();
$obj2 = Demo::getInstance();
$obj3 = Demo::getInstance();
$obj4 = Demo::getInstance();
$obj5 = Demo::getInstance();
echo '<pre>';
var_dump($obj1,$obj2,$obj3,$obj4,$obj5);

执行结果如下图:

2018-01-15_154451.png

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议