文件上传

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

假设表单代码如下:

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

然后修改Index.php控制器为如下的代码:

<?php
namespace app\controller;
use x\Controller;

class Index extends Controller
{
    /**
     * 输出视图
     * @RequestMapping(route="/", method="get", title="主页")
    */
    public function index() {
        // 模板渲染
        return $this->view('index');
    }

    /**
     * @RequestMapping(route="index/upload", method="post", title="上传文件Demo")
    */
    public function index() {
        // 获取表单上传文件 例如上传了001.jpg
        $file = $this->file('image');
        // 移动到框架应用根目录/uploads/ 目录下
        $info = $file->move(ROOT_PATH.'/uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出 保存的相对路径 /uploads/文件保存地址
            echo $info->getSaveName();
            // 输出 保存的文件名
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }
}

上传验证

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

<?php
namespace app\controller;
use x\Controller;

class Index extends Controller
{
    /**
     * 输出视图
     * @RequestMapping(route="/", method="get", title="主页")
    */
    public function index() {
        // 模板渲染
        return $this->view('index');
    }

    /**
     * @RequestMapping(route="index/upload", method="post", title="上传文件Demo")
    */
    public function index() {
        // 获取表单上传文件 例如上传了001.jpg
        $file = $this->file('image');
        // 移动到框架应用根目录/uploads/ 目录下
        $info = $file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH.'/uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出 保存的相对路径 /uploads/文件保存地址
            echo $info->getSaveName();
            // 输出 保存的文件名
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }
}

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

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

上传配置

SW-X对文件上传有默认配置,存放在/config/app.phpfile节点下。

<?php
// +-----------------------------
// | 文件上传配置
// +-----------------------------

'file' => [
    // 最大上传大小(KB)
    'size' => 15678,
    // 允许上传路径
    'ext' => 'jpg,jpeg,png,gif',
    // 保存目录不存在是否自动创建
    'auto_save' => true,
    // 文件名生成算法,支持sha1,md5,time三种
    'name_algorithm' => 'time',
    // 文件默认保存目录
    'path' => ROOT_PATH.'/upload/',
],

系统默认提供了几种上传命名规则,包括:

规则描述
date根据日期和随机数生成
md5对文件使用md5(time规则)散列生成
sha1对文件使用sha1(time规则)散列生成

上传文件组件暂不支持多文件上传功能,但可以对$this->file($FILES['pic'][0])的方式实现循环上传。

注意:在Swoole中默认文件最大上传限制只有2M,我们除了修改框架的文件上传限制外,还需要修改server.php配置文件中的package_max_length选项。