目录 搜索
序言基础安装ThinkPHP开发规范目录结构架构架构总览生命周期入口文件URL访问模块设计命名空间自动加载Traits引入API友好配置配置目录配置格式配置加载读取配置动态配置独立配置配置作用域环境变量配置路由路由模式路由定义批量注册变量规则组合变量路由参数路由地址资源路由快捷路由路由别名路由分组MISS路由闭包支持路由绑定绑定模型域名路由URL生成控制器控制器定义控制器初始化前置操作跳转和重定向空操作空控制器多级控制器分层控制器Rest控制器自动定位控制器资源控制器请求请求信息输入变量更改变量请求类型请求伪装HTTP头信息伪静态方法注入属性注入参数绑定依赖注入请求缓存数据库连接数据库基本使用查询构造器查询数据添加数据更新数据删除数据查询方法查询语法链式操作wheretablealiasfieldorderlimitpagegrouphavingjoinuniondistinctlockcachecommentfetchSqlforcebindpartitionstrictfailExceptionsequence聚合查询时间查询高级查询视图查询子查询原生查询查询事件事务操作监听SQL存储过程数据集分布式数据库模型定义模型初始化新增更新删除查询聚合获取器修改器时间戳只读字段软删除类型转换数据完成查询范围模型分层数组访问和转换JSON序列化事件关联一对一关联一对多关联远程一对多多对多关联多态一对多动态属性关联预载入关联统计聚合模型视图视图实例化模板引擎模板赋值模板渲染输出替换模板模板定位模板标签变量输出系统变量请求参数使用函数使用默认值使用运算符三元运算原样输出模板注释模板布局模板继承包含文件标签库内置标签循环输出标签比较标签条件判断资源文件加载标签嵌套原生PHP定义标签日志介绍日志驱动日志写入独立日志日志清空写入授权错误和调试调试模式异常处理抛出异常Trace调试变量调试性能调试SQL调试远程调试404页面验证验证器验证规则错误信息验证场景控制器验证模型验证内置规则静态调用表单令牌安全输入安全数据库安全上传安全其它安全建议杂项缓存SessionCookie多语言分页上传验证码图像处理文件处理单元测试扩展函数类库行为驱动Composer包Time数据库迁移工具WorkermanMongoDbSAE标签扩展命令行自动生成目录结构创建类库文件生成类库映射文件生成路由缓存清除缓存文件生成配置缓存文件生成数据表字段缓存自定义命令行部署虚拟主机环境Linux 主机环境URL重写附录配置参考常量参考助手函数升级指导更新日志
文字

上传文件

ThinkPHP5.0对文件上传的支持更加简单。

内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要自己扩展。

假设表单代码如下:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br> 
<input type="submit" value="上传" /> 
</form> 

然后在控制器中添加如下的代码:

public function upload(){
    // 获取表单上传文件 例如上传了001.jpg
    $file = request()->file('image');
    // 移动到框架应用根目录/public/uploads/ 目录下
    $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
    if($info){
        // 成功上传后 获取上传信息
        // 输出 jpg
        echo $info->getExtension();
        // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        // 输出 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename(); 
    }else{
        // 上传失败获取错误信息
        echo $file->getError();
    }
}

move方法成功的话返回的是一个SplFileInfo对象,你可以对上传后的文件进行后续操作。

多文件上传

如果你使用的是多文件上传表单,例如:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image[]" /> <br> 
<input type="file" name="image[]" /> <br> 
<input type="file" name="image[]" /> <br> 
<input type="submit" value="上传" /> 
</form> 

控制器代码可以改成:

public function upload(){
    // 获取表单上传文件
    $files = request()->file('image');
    foreach($files as $file){
        // 移动到框架应用根目录/public/uploads/ 目录下
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出 jpg
            echo $info->getExtension(); 
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }    
    }
}

上传验证

支持对上传文件的验证,包括文件大小、文件类型和后缀:

public function upload(){
    // 获取表单上传文件 例如上传了001.jpg
    $file = request()->file('image');
    // 移动到框架应用根目录/public/uploads/ 目录下
    $info = $file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
    if($info){
        // 成功上传后 获取上传信息
        // 输出 jpg
        echo $info->getExtension();
        // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        // 输出 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename(); 
    }else{
        // 上传失败获取错误信息
        echo $file->getError();
    }
}

如果上传文件验证不通过,则move方法返回false。

验证参数 说明
size 上传文件的最大字节
ext 文件后缀,多个用逗号分割或者数组
type 文件MIME类型,多个用逗号分割或者数组

还有一个额外的自动验证规则是,如果上传的文件后缀是图像文件后缀,则会检查该文件是否是一个合法的图像文件。

上传规则

默认情况下,会在上传目录下面生成以当前日期为子目录,以微秒时间的md5编码为文件名的文件,例如上面生成的文件名可能是:

/home/www/upload/20160510/42a79759f284b767dfcb2a0197904287.jpg

我们可以指定上传文件的命名规则,使用rule方法即可,例如:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用md5规则
$file->rule('md5')->move('/home/www/upload/');

最终生成的文件名类似于:

/home/www/upload/72/ef580909368d824e899f77c7c98388.jpg
系统默认提供了几种上传命名规则,包括: 规则 描述
date 根据日期和微秒数生成
md5 对文件使用md5_file散列生成
sha1 对文件使用sha1_file散列生成

其中md5和sha1规则会自动以散列值的前两个字符作为子目录,后面的散列值作为文件名。

如果需要使用自定义命名规则,可以在rule方法中传入函数或者方法,例如:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用uniqid规则
$file->rule('uniqid')->move('/home/www/upload/');

生成的文件名类似于:

/home/www/upload/573d3b6d7abe2.jpg

如果你希望保留原文件名称,可以使用:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$file->move('/home/www/upload/','');

默认情况下,会覆盖服务器上传目录下的同名文件,如果不希望覆盖,可以使用:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且设置不覆盖
$file->move('/home/www/upload/',true,false);

获取文件hash散列值

可以获取上传文件的哈希散列值,例如:

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->md5();
echo $upload->sha1();

v5.0.1以上版本可以统一使用hash方法获取文件散列值

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->hash('sha1');
echo $upload->hash('md5');

返回对象

上传成功后返回的仍然是一个File对象,除了File对象自身的方法外,并且可以使用SplFileObject的属性和方法,便于进行后续的文件处理。

上一篇: 下一篇:
  页面正在加载中