TP6的文件上传相较于之前的版本有些变化,用法变了,也相对的更灵活了。下面是文件上传的使用示例。
还算说得挺清楚的了,如果还有什么疑问,可以在评论区留言。

前端代码

<!-- 请注意换一下action的提交地址,这里使用了URL生成的助手函数,参考https://www.kancloud.cn/manual/thinkphp6_0/1037508 -->
<form action="{:url('Upload/index')}" method="post" enctype="multipart/form-data">
    <!-- 文件选择按钮 -->
    <input type="file" name="file">
    <!-- 表单提交按钮 -->
    <button type="submit">提交</button>
</form>

配置文件

路径:/config/filesystem.php

<?php

use think\facade\Env;

return [
    // 默认磁盘
    'default' => Env::get('filesystem.driver', 'local'),
    // 磁盘列表
    'disks'   => [
        'local'  => [
            'type' => 'local',
            'root' => app()->getRuntimePath() . 'storage',
        ],
        'public' => [
            // 磁盘类型
            'type'       => 'local',
            // 磁盘路径
            'root'       => app()->getRootPath() . 'public/storage',
            // 磁盘路径对应的外部URL路径
            'url'        => '/storage',
            // 可见性:public=公共,private=私有
            'visibility' => 'public',
        ],
        // 更多的磁盘配置信息
    ],
];

上传处理代码

// 上传文件错误或者文件验证不通过时,都会抛出异常,所以要使用try来捕捉异常
try {
    // 获取上传的文件,如果有上传错误,会抛出异常
    $file = \think\facade\Request::file('file');
    // 如果上传的文件为null,手动抛出一个异常,统一处理异常
    if (null === $file) {
        // 异常代码使用UPLOAD_ERR_NO_FILE常量,方便需要进一步处理异常时使用
        throw new \Exception('请上传文件', UPLOAD_ERR_NO_FILE);
    }

    // 使用验证器验证上传的文件
    validate(['file' => [
        // 限制文件大小(单位b),这里限制为4M
        'fileSize' => 4 * 1024 * 1024,
        // 限制文件后缀,多个后缀以英文逗号分割
        'fileExt'  => 'gif,jpg,png'
        // 更多规则请看“上传验证”的规则,文档地址https://www.kancloud.cn/manual/thinkphp6_0/1037629#_444
    ]])->check(['file' => $file]);

    // 保存路径,实际保存路径为“磁盘路径” + “avatar”
    $path = 'avatar';
    // 文件名规则,默认是当前时间。可以使用哈希算法,如:md5/sha1等,还可以传入匿名函数,详细可以看后面
    $rule = 'md5';
    // 将文件保存public磁盘,文件名为$rule指定的规则。然后将文件路径赋值给$path
    $path = \think\facade\Filesystem::disk('public')->putFile($path, $file, $rule);
    // 拼接URL路径
    $url = \think\facade\Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path);
} catch (\Exception $e) {
    // 如果上传时有异常,会执行这里的代码,可以在这里处理异常
    return json([
        'code' => 1,
        'msg'  => $e->getMessage(),
    ]);
}

$info = [
    // 文件路径:avatar/a4/e7b9e4ce42e2097b0df2feb8832d28.jpg
    'path' => $path,
    // URL路径:/storage/avatar/a4/e7b9e4ce42e2097b0df2feb8832d28.jpg
    'url'  => $url,
    // 文件大小(字节)
    'size' => $file->getSize(),
    // 文件名:读书顶个鸟用.jpg
    'name' => $file->getFilename(),
    // 文件MINE:image/jpeg
    'mime' => $file->getMime(),
];
halt($info);

文件名规则

文件名规则支持传入匿名函数、哈希算法和函数名。默认情况下,使用时间来自动生成。

默认算法

默认情况下,文件名是这样生成的

date('Ymd') . DIRECTORY_SEPARATOR . md5((string) microtime(true))

结果是

/storage/avatar/20200117/2801a4c6c49a1e411f58abfa9b4a8f52.jpg

匿名函数

/**
 * @param \think\file\UploadedFile $file 文件
 * @return string 文件名
 */
$rule = function(\think\file\UploadedFile $file) {
    // 获取获取上传文件类型信息:image/jpeg
    $file->getOriginalMime();
    // 获取上传文件名:读书顶个鸟用.jpg
    $file->getOriginalName();
    // 获取文件扩展名:jpg
    $file->extension();
    // 获取文件的哈希散列值
    $file->hash();

    return $file->hash('md5');
};
$path = \think\facade\Filesystem::disk('public')->putFile($path, $file, $rule);

结果是

/storage/avatar/a4e7b9e4ce42e2097b0df2feb8832d28.jpg

哈希算法

支持传入hash_algos()里支持的算法,如md5,sha1,sha256

$rule = 'sha1';
$path = \think\facade\Filesystem::disk('public')->putFile($path, $file, $rule);

结果是

/storage/avatar/ef/c6e7f357b7f97cb7ccfa7c5cfe83bf9819f88f.jpg

使用哈希算法会自动取文件哈希值前两个字符作为目录名

函数名

这里传入time,还可以传入自定义函数名或php内置函数名。但只支持可不传参数的函数

$rule = 'time';
$path = \think\facade\Filesystem::disk('public')->putFile($path, $file, $rule);

结果是

/storage/avatar/1579228212.jpg

标签: thinkphp6

添加新评论