Sivo 悉见

开发 Composer 包详细步骤

匿名 · 更新于 2019/1/30

开发一个 composer 通用文件上传包,发布到 Packagist,并在 Laravel 中测试。

 

一、GitHub 创建一个名 uploadfile 新仓库,并克隆至本地。

$ git clone git@github.com:guanguans/uploadfile.git
$ cd uploadfile

二、初始化项目,生成composer.json文件

2.1 步骤

yzm@Alert MINGW64 /i/phpstudy/WWW/uploadfile
$ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [yzm/try-make-package]: guanguans/uploadfile
Description []: 一个通用文件上传包
Author [guanguans <53222411@qq.com>, n to skip]: guanguans <yzmguanguan@gmail.com>                                                                                 
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: l                                                                                                    ibrary
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]                                                                                                    ? yes
Search for a package: php
Enter the version constraint to require (or leave blank to use the lates                                                                                                    t version): >=5.4.0
Search for a package:
Would you like to define your dev dependencies (require-dev) interactive                                                                                                    ly [yes]? yes
Search for a package: php
Enter the version constraint to require (or leave blank to use the lates                                                                                                    t version): >=5.4.0
Search for a package:

{
    "name": "guanguans/uploadfile",
    "description": "一个通用文件上传包",
    "type": "library",
    "require": {
        "php": ">=5.4"
    },
    "require-dev": {
        "php": ">=5.4"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "guanguans",
            "email": "yzmguanguan@gmail.com"
        }
    ],
    "minimum-stability": "dev"
}

Do you confirm generation [yes]? yes

2.2 步骤解释

yzm@Alert MINGW64 /i/phpstudy/WWW/uploadfile
$ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

// 1. 输入项目命名空间
// 注意<vendor>/<name> 必须要符合 [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [dell/htdocs]: yourname/projectname

// 2. 项目描述
Description []: 这是一个测试

// 3. 输入作者信息,可以直接回车
Author [guanguans <53222411@qq.com>, n to skip]:

// 4. 输入最低稳定版本,stable, RC, beta, alpha, dev
Minimum Stability []: dev

// 5. 输入项目类型,
Package Type (e.g. library, project, metapackage, composer-plugin) []: library

// 6. 输入授权类型
License []:
> Define your dependencies.

// 7. 输入依赖信息
Would you like to define your dependencies (require) interactively [yes]?

// 如果需要依赖,则输入要安装的依赖
Search for a package: php

// 输入版本号
Enter the version constraint to require (or leave blank to use the latest version): >=5.4.0

// 如需多个,则重复以上两个步骤

// 8. 是否需要require-dev,
Would you like to define your dev dependencies (require-dev) interactively [yes]?

// 操作同上
{
    "name": "guanguans/uploadfile",
    "description": "一个通用文件上传包",
    "type": "library",
    "require": {
        "php": ">=5.4"
    },
    "require-dev": {
        "php": ">=5.4"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "guanguans",
            "email": "yzmguanguan@gmail.com"
        }
    ],
    "minimum-stability": "dev"
}

// 9. 是否生成composer.json
Do you confirm generation [yes]? yes

三、添加自动加载

在上一步生成的composer.json中追加

 

"autoload": {
    "psr-4": {
        "Guanguans\\": "src/"
    }
}

四、构建项目

4.1 新建uploadfile/src/UploadFile.php

 
├─uploadfile                
│  ├─src                     
│  │  ├─UploadFile.php
│  └─composer.json

<?php
/**
 * 通用文件上传类
 * @author  guanguans <yzmguanguan@gmail.com>
 */
namespace Guanguans;  // 注意命名空间与 composer.json 中的一致

class UploadFile { private $config = [
'maxSize' => -1, // 上传文件的最大值 'supportMulti' => true, // 是否支持多文件上传 'allowExts' => [], // 允许上传的文件后缀 留空不作后缀检查 'allowTypes' => [], // 允许上传的文件类型 留空不做检查 'thumb' => false, // 使用对上传图片进行缩略图处理 'imageClassPath' => 'ORG.Util.Image', // 图库类包路径 'thumbMaxWidth' => '',// 缩略图最大宽度 'thumbMaxHeight' => '',// 缩略图最大高度 'thumbPrefix' => 'thumb_',// 缩略图前缀 'thumbSuffix' => '', 'thumbPath' => '',// 缩略图保存路径 'thumbFile' => '',// 缩略图文件名 'thumbExt' => '',// 缩略图扩展名 'thumbRemoveOrigin' => false,// 是否移除原图 'thumbType' => 1, // 缩略图生成方式 1 按设置大小截取 0 按原图等比例缩略 'zipImages' => false,// 压缩图片文件上传 'autoSub' => false,// 启用子目录保存文件 'subType' => 'hash',// 子目录创建方式 可以使用hash date custom 'subDir' => '', // 子目录名称 subType为custom方式后有效 'dateFormat' => 'Ymd', 'hashLevel' => 1, // hash的目录层次 'savePath' => '',// 上传文件保存路径 'autoCheck' => true, // 是否自动检查附件 'uploadReplace' => false,// 存在同名是否覆盖 'saveRule' => 'uniqid',// 上传文件命名规则 'hashType' => 'md5_file',// 上传文件Hash规则函数名 ];

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 错误信息</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> $error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;&#39;</span>;
<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 上传成功的文件信息</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> $uploadFileInfo ;

<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">__get</span><span class="hljs-params" style="box-sizing: border-box;">($name)</span></span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">isset</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config[$name])) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config[$name];
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">null</span>;
}

<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">__set</span><span class="hljs-params" style="box-sizing: border-box;">($name,$value)</span></span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">isset</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config[$name])) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config[$name]    =   $value;
    }
}

<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">__isset</span><span class="hljs-params" style="box-sizing: border-box;">($name)</span></span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">isset</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config[$name]);
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 架构函数
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> array $config  上传参数
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">__construct</span><span class="hljs-params" style="box-sizing: border-box;">($config=[])</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(is_array($config)) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config   =   array_merge(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;config,$config);
    }
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 上传一个文件
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> mixed $name 数据
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $value  数据表名
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> string
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">save</span><span class="hljs-params" style="box-sizing: border-box;">($file)</span> </span>{
    $filename = $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>].$file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>];
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;uploadReplace &amp;&amp; is_file($filename)) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 不覆盖同名文件</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error    =   <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;文件已经存在!&#39;</span>.$filename;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 如果是图像文件 检测文件格式</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>( in_array(strtolower($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]), [<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gif&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;jpg&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;jpeg&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;bmp&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;png&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;swf&#39;</span>])) {
        $info   = getimagesize($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;tmp_name&#39;</span>]);
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span> === $info || (<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gif&#39;</span> == strtolower($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]) &amp;&amp; <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($info[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;bits&#39;</span>]))){
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;非法图像文件&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
        }
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!move_uploaded_file($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;tmp_name&#39;</span>], <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;autoCharset($filename,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;utf-8&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gbk&#39;</span>))) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;文件上传保存错误!&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumb &amp;&amp; in_array(strtolower($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]), [<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gif&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;jpg&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;jpeg&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;bmp&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;png&#39;</span>])) {
        $image =  getimagesize($filename);
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span> !== $image) {
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//是图像文件生成缩略图</span>
            $thumbWidth     =   explode(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;,&#39;</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbMaxWidth);
            $thumbHeight    =   explode(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;,&#39;</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbMaxHeight);
            $thumbPrefix    =   explode(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;,&#39;</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbPrefix);
            $thumbSuffix    =   explode(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;,&#39;</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbSuffix);
            $thumbFile      =   explode(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;,&#39;</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbFile);
            $thumbPath      =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbPath?<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbPath:dirname($filename).<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;/&#39;</span>;
            $thumbExt       =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbExt ? <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbExt : $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]; <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//自定义缩略图扩展名</span>
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 生成图像缩略图</span>
            import(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;imageClassPath);
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">for</span>($i=<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>,$len=count($thumbWidth); $i&lt;$len; $i++) {
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($thumbFile[$i])) {
                    $thumbname  =   $thumbFile[$i];
                }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span>{
                    $prefix     =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">isset</span>($thumbPrefix[$i])?$thumbPrefix[$i]:$thumbPrefix[<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>];
                    $suffix     =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">isset</span>($thumbSuffix[$i])?$thumbSuffix[$i]:$thumbSuffix[<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>];
                    $thumbname  =   $prefix.basename($filename,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;.&#39;</span>.$file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]).$suffix;
                }
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">1</span> == <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbType){
                    Image::thumb2($filename,$thumbPath.$thumbname.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;.&#39;</span>.$thumbExt,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;&#39;</span>,$thumbWidth[$i],$thumbHeight[$i],<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>);
                }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span>{
                    Image::thumb($filename,$thumbPath.$thumbname.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;.&#39;</span>.$thumbExt,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;&#39;</span>,$thumbWidth[$i],$thumbHeight[$i],<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>);
                }

            }
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;thumbRemoveOrigin) {
                <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 生成缩略图之后删除原图</span>
                unlink($filename);
            }
        }
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;zipImags) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// TODO 对图片压缩包在线解压</span>

    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 上传所有文件
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $savePath  上传文件保存路径
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> string
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">upload</span><span class="hljs-params" style="box-sizing: border-box;">($savePath =<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;&#39;</span>)</span> </span>{
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//如果不指定保存文件名,则由系统默认</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($savePath))
        $savePath = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;savePath;
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 检查上传目录</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!is_dir($savePath)) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 检查目录是否编码后的</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(is_dir(base64_decode($savePath))) {
            $savePath   =   base64_decode($savePath);
        }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span>{
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 尝试创建目录</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!mkdir($savePath)){
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error  =  <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传目录&#39;</span>.$savePath.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;不存在&#39;</span>;
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
            }
        }
    }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!is_writeable($savePath)) {
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error  =  <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传目录&#39;</span>.$savePath.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;不可写&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
        }
    }
    $fileInfo   = [];
    $isUpload   = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;

    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 获取上传的文件信息</span>
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 对$_FILES数组信息处理</span>
    $files   =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;dealFiles($_FILES);
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">foreach</span>($files <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">as</span> $key =&gt; $file) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//过滤无效的上传</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>])) {
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//登记上传文件的扩展信息</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">isset</span>($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;key&#39;</span>]))   $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;key&#39;</span>]    =   $key;
            $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]  =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;getExt($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>]);
            $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>]   =   $savePath;
            $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>]   =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;getSaveName($file);

            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 自动检查附件</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;autoCheck) {
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;check($file))
                    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
            }

            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//保存上传文件</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;save($file)) <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(function_exists(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;hashType)) {
                $fun =  <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;hashType;
                $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;hash&#39;</span>]   =  $fun(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;autoCharset($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>].$file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>],<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;utf-8&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gbk&#39;</span>));
            }
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//上传成功后保存文件信息,供其他地方调用</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">unset</span>($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;tmp_name&#39;</span>],$file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;error&#39;</span>]);
            $fileInfo[] = $file;
            $isUpload   = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>;
        }
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>($isUpload) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;uploadFileInfo = $fileInfo;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>;
    }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error  =  <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;没有选择上传文件&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 上传单个上传字段中的文件 支持多附件
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> array $file  上传文件信息
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $savePath  上传文件保存路径
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> string
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">uploadOne</span><span class="hljs-params" style="box-sizing: border-box;">($file,$savePath=<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;&#39;</span>)</span></span>{
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//如果不指定保存文件名,则由系统默认</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($savePath))
        $savePath = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;savePath;
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 检查上传目录</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!is_dir($savePath)) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 尝试创建目录</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!mkdir($savePath,<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0777</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>)){
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error  =  <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传目录&#39;</span>.$savePath.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;不存在&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
        }
    }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!is_writeable($savePath)) {
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error  =  <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传目录&#39;</span>.$savePath.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;不可写&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
        }
    }
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//过滤无效的上传</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>])) {
        $fileArray = [];
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(is_array($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>])) {
           $keys = array_keys($file);
           $count    =   count($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>]);
           <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">for</span> ($i=<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>; $i&lt;$count; $i++) {
               <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">foreach</span> ($keys <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">as</span> $key)
                   $fileArray[$i][$key] = $file[$key][$i];
           }
        }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span>{
            $fileArray[] =  $file;
        }
        $info =  [];
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">foreach</span> ($fileArray <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">as</span> $key=&gt;$file){
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//登记上传文件的扩展信息</span>
            $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>]  = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;getExt($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>]);
            $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>]   = $savePath;
            $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>]   = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;getSaveName($file);
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 自动检查附件</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;autoCheck) {
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;check($file))
                    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
            }
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//保存上传文件</span>
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;save($file)) <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(function_exists(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;hashType)) {
                $fun =  <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;hashType;
                $file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;hash&#39;</span>]   =  $fun(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;autoCharset($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>].$file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>],<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;utf-8&#39;</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gbk&#39;</span>));
            }
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">unset</span>($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;tmp_name&#39;</span>],$file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;error&#39;</span>]);
            $info[] = $file;
        }
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 返回上传的文件信息</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $info;
    }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error  =  <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;没有选择上传文件&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 转换上传文件数组变量为正确的方式
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> array $files  上传的文件变量
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> array
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">dealFiles</span><span class="hljs-params" style="box-sizing: border-box;">($files)</span> </span>{
    $fileArray  = [];
    $n          = <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>;
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">foreach</span> ($files <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">as</span> $key=&gt;$file){
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(is_array($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>])) {
            $keys       =   array_keys($file);
            $count      =   count($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>]);
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">for</span> ($i=<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>; $i&lt;$count; $i++) {
                $fileArray[$n][<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;key&#39;</span>] = $key;
                <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">foreach</span> ($keys <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">as</span> $_key){
                    $fileArray[$n][$_key] = $file[$_key][$i];
                }
                $n++;
            }
        }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span>{
           $fileArray[$key] = $file;
        }
    }
   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $fileArray;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 获取错误代码信息
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $errorNo  错误号码
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> void
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">protected</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">error</span><span class="hljs-params" style="box-sizing: border-box;">($errorNo)</span> </span>{
     <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">switch</span>($errorNo) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">1</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">2</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">3</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;文件只有部分被上传&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">4</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;没有文件被上传&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">6</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;找不到临时文件夹&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">7</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;文件写入失败&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">default</span>:
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;未知上传错误!&#39;</span>;
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> ;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 根据上传文件命名规则取得保存文件名
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $filename 数据
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> string
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">getSaveName</span><span class="hljs-params" style="box-sizing: border-box;">($filename)</span> </span>{
    $rule = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;saveRule;
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($rule)) {<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//没有定义命名规则,则保持文件名不变</span>
        $saveName = $filename[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;name&#39;</span>];
    }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(function_exists($rule)) {
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//使用函数生成一个唯一文件标识号</span>
            $saveName = $rule().<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&quot;.&quot;</span>.$filename[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>];
        }<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
            <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//使用给定的文件名作为标识号</span>
            $saveName = $rule.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&quot;.&quot;</span>.$filename[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>];
        }
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;autoSub) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 使用子目录保存文件</span>
        $filename[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>] = $saveName;
        $saveName = <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;getSubName($filename).$saveName;
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $saveName;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 获取子目录的名称
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> array $file  上传的文件信息
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> string
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">getSubName</span><span class="hljs-params" style="box-sizing: border-box;">($file)</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">switch</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;subType) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;custom&#39;</span>:
            $dir    =   <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;subDir;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;date&#39;</span>:
            $dir    =   date(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;dateFormat,time()).<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;/&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">case</span> <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;hash&#39;</span>:
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">default</span>:
            $name   =   md5($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savename&#39;</span>]);
            $dir    =   <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;&#39;</span>;
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">for</span>($i=<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>;$i&lt;<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;hashLevel;$i++) {
                $dir   .=  $name{$i}.<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;/&#39;</span>;
            }
            <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">break</span>;
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!is_dir($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>].$dir)) {
        mkdir($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;savepath&#39;</span>].$dir,<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0777</span>,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>);
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $dir;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 检查上传的文件
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> array $file 文件信息
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> boolean
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">check</span><span class="hljs-params" style="box-sizing: border-box;">($file)</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;error&#39;</span>]!== <span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">0</span>) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//文件上传失败</span>
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//捕获错误代码</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;error&#39;</span>]);
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//文件上传成功,进行自定义规则检查</span>
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//检查文件大小</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;checkSize($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;size&#39;</span>])) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传文件大小不符!&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }

    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//检查文件Mime类型</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;checkType($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;type&#39;</span>])) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传文件MIME类型不允许!&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//检查文件类型</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;checkExt($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>])) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error =<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;上传文件类型不允许&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }

    <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//检查是否合法上传</span>
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;checkUpload($file[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;tmp_name&#39;</span>])) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error = <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;非法上传文件!&#39;</span>;
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">false</span>;
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">// 自动转换字符集 支持数组转换</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">autoCharset</span><span class="hljs-params" style="box-sizing: border-box;">($fContents, $from=<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;gbk&#39;</span>, $to=<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;utf-8&#39;</span>)</span> </span>{
    $from   = strtoupper($from) == <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;UTF8&#39;</span> ? <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;utf-8&#39;</span> : $from;
    $to     = strtoupper($to) == <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;UTF8&#39;</span> ? <span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;utf-8&#39;</span> : $to;
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span> (strtoupper($from) === strtoupper($to) || <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>($fContents) || (is_scalar($fContents) &amp;&amp; !is_string($fContents))) {
        <span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">//如果编码相同或者非字符串标量则不转换</span>
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $fContents;
    }
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span> (function_exists(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;mb_convert_encoding&#39;</span>)) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> mb_convert_encoding($fContents, $to, $from);
    } <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">elseif</span> (function_exists(<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;iconv&#39;</span>)) {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> iconv($from, $to, $fContents);
    } <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">else</span> {
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $fContents;
    }
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 检查上传的文件类型是否合法
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $type 数据
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> boolean
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">checkType</span><span class="hljs-params" style="box-sizing: border-box;">($type)</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;allowTypes))
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> in_array(strtolower($type),<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;allowTypes);
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>;
}


<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 检查上传的文件后缀是否合法
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $ext 后缀名
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> boolean
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">checkExt</span><span class="hljs-params" style="box-sizing: border-box;">($ext)</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">if</span>(!<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">empty</span>(<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;allowExts))
        <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> in_array(strtolower($ext),<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;allowExts,<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>);
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">true</span>;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 检查文件大小是否合法
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> integer $size 数据
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> boolean
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">checkSize</span><span class="hljs-params" style="box-sizing: border-box;">($size)</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> !($size &gt; <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;maxSize) || (<span class="hljs-number" style="box-sizing: border-box; color: rgb(209, 154, 102);">-1</span> == <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;maxSize);
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 检查文件是否非法提交
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $filename 文件名
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> boolean
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">checkUpload</span><span class="hljs-params" style="box-sizing: border-box;">($filename)</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> is_uploaded_file($filename);
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 取得上传文件的后缀
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> private
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@param</span> string $filename 文件名
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> boolean
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">private</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">getExt</span><span class="hljs-params" style="box-sizing: border-box;">($filename)</span> </span>{
    $pathinfo = pathinfo($filename);
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> $pathinfo[<span class="hljs-string" style="box-sizing: border-box; color: rgb(152, 195, 121);">&#39;extension&#39;</span>];
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 取得上传文件的信息
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> array
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">getUploadFileInfo</span><span class="hljs-params" style="box-sizing: border-box;">()</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;uploadFileInfo;
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(146, 146, 146);">/**
 * 取得最后一次错误信息
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@access</span> public
 * <span class="hljs-doctag" style="box-sizing: border-box; color: rgb(198, 120, 221);">@return</span> string
 */</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">function</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">getErrorMsg</span><span class="hljs-params" style="box-sizing: border-box;">()</span> </span>{
    <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">return</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(198, 120, 221);">$this</span>-&gt;error;
}

}


4.2 测试

4.2.1 终端下执行 composer install,这时会生成vendor目录,及其他文件

 
yzm@Alert MINGW64 /i/phpstudy/WWW/uploadfile
$ composer install

4.2.2 新建uploadfile/test/UpploadFileTest.phpuploadfile/test/UpploadFile.html

  • UpploadFileTest.php
<?php

require_once '../vendor/autoload.php';

use Guanguans<span class="hljs-title" style="box-sizing: border-box; color: rgb(97, 174, 238);">UploadFile;

$upload = new UploadFile(); $upload->maxSize = 110241024; // 默认为-1,不限制上传大小 $upload->savePath = './upload/'; // 上传根目录 $upload->saveRule = 'uniqid'; // 上传文件的文件名保存规则 $upload->uploadReplace = true; // 如果存在同名文件是否进行覆盖 $upload->autoSub = true; // 上传子目录开启 $upload->subType = 'date'; // 上传子目录命名规则 $upload->allowExts = ['jpg', 'png']; // 允许类型

if ($upload->upload()) { var_dump($upload->getUploadFileInfo()); } else { var_dump($upload->getErrorMsg()); }


  • UpploadFile.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>uploadfile test</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <form action="UpploadfileTest.php" method="post" enctype="multipart/form-data">
        <div class="form-group">
            <label>单文件上传</label>
            <input type="file" name="uploadfile">
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
    <hr>
    <form action="UpploadfileTest.php" method="post" enctype="multipart/form-data">
        <div class="form-group">
            <label>多文件上传</label>
            <input type="file" name="uploadfile[]">
            <input type="file" name="uploadfile[]">
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
</body>
</html>
4.2.3 本地浏览器访问uploadfile/test/UpploadFile.html进行测试



 

五、添加 README.mdLICENSE.gitignore等文件,项目最终结构如下:我的包GitHub地址

 
├─uploadfile                扩展包根目录
│  ├─src                    扩展包代码目录
│  │  ├─UploadFile.php
│  ├─test                   测试目录
│  │  ├─uploadfile.html
│  │  ├─UpploadfileTest.php
│  ├─.gitignore
│  ├─composer.json
│  ├─LICENSE
│  └─README.md

六、推送到 GitHub

 
git add .
git commit -m 'init'
git tag v1.0.0 // 记住打一个版本号
git push origin master
git push v1.0.0

七、将 GitHub 上的包提交到 Packagist

  • 首先要在 Packagist 上注册账号并登录(可以用 GitHub 直接登录)
  • 点击顶部导航条中的 Summit 按钮
  • 在输入框中输入 GitHub 上的刚才包地址,如:https://github.com/guanguans/uploadfile
  • 然后点击 Check 按钮 Packagist 会去检测此仓库地址的代码是否符合 Composer 的 Package 包的要求
    检测正常的话,会出现 Submit 按钮,再点击一下 Submit 按钮,我们的包就提交到 Packagist 上了





 

八、设置 composer 包自动更新

上面提交上的包提交的包,当我们更新 GitHub 仓库时,Packagist 上面的的包并不会自动更新,现在我们来设置一下自动更新

8.1 复制 Profile API Token




 

8.2 打开 GitHub 项目 setting,选择 Integrations & services,添加 packagist service,点击 Test service











 

8.3 验证是否已经自动更新

移步 Packagist 包主页,发现已经没有了红色的圈住的提示,说明设置自动更新成功。




 

九、项目中使用

我以 Laravel 中使用举例

 

composer create-project laravel/laravel
cd laravel
composer require guanguans/uploadfile





 

其他


本文为琯琯原创文章,转载无需和我联系,但请注明来自琯琯博客 https://guanguans.cn