laravel9 + minio对象存储文件上传流程步骤示例代码

2023-06-01 00:00:00 示例 步骤 文件上传

minio是目前githug上star最多的Object Storage框架,这里Object Storage就是数据存储,

minio可以用来搭建分布式存储服务,这里就不过多介绍,

下面只讲laravel9 + minio实现文件上传功能


准备工作:

1、安装好minio;

2、登录后台创建一个BUCKET桶


进入步骤:

1.安装扩展

composer require -W league/flysystem-aws-s3-v3 "^3.0"


2.配置文件.env设置

# .env 配置
AWS_ACCESS_KEY_ID=you-minio-username
AWS_SECRET_ACCESS_KEY=you-minio-password
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=web # minio 桶
AWS_USE_PATH_STYLE_ENDPOINT=false
AWS_ENDPOINT=http://192.168.1.100:9000
CDN_HOST=http://cdn.domain.com


2.实现上传功能

<?php
namespace App\Http\Controllers\Upload;

use App\Http\Controllers\Controller;
use App\Utils\AssertUtils;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class Index extends Controller
{
    public function upload()
    {
        $file = \request()->file("file");
        AssertUtils::isNull($file,"请选择文件");
        AssertUtils::isTrue(!$file->isValid(),"文件无效");
       
        // 文件类型
        $fileType = explode("/", $file->getClientMimeType())[0];
        $ext = $file->getClientOriginalExtension();
        AssertUtils::isTrue(!in_array($ext, self::enableUploadExt()), '该文件不支持上传');
       
        // 上传文件大小限制为2m
        $fileSize = round($file->getSize() / 1024, 2);
        AssertUtils::isTrue($fileSize > 5 * 1024, "文件大小不能超过5M");
       
        // 非登录用户禁止上传文件 (不需要登录验证可删除)
        $user = \request()->user();
        AssertUtils::isTrue(is_null($user), "禁止上传文件");
        $path = Storage::disk(self::getOssType())->put(self::getFileDist($fileType),$file);
        return $this->resData([
            "name" => $file->getClientOriginalName(),
            "size" => ($file->getSize() / 1024 * 1024),
            "url" => env("CDN_HOST") . "/" . self::backetName() . "/" . $path,
            "fileType" => $fileType
        ]);
    }
   
    public function delete()
    {
          // 完整的地址:http://baidu.com/web/images/xxx.jpg
        $url = \request("url");
        if (is_null($url)) return $this->error("文件地址不能为空");
        $explode = explode("/", $url);
        $fileName = "/" . implode("/", array_splice($explode, 4, 6));
       
        // 判断文件是否存在
        $existFile = Storage::disk(self::getOssType())->exists($fileName);
        if (!$existFile) {
            return $this->success("文件不存在!");
        }
        Storage::disk(self::getOssType())->delete($fileName);
        return $this->success("删除成功!");
    }
   
    /**
     * 文件存储桶
     */
    private static function backetName()
    {
        return env("AWS_BUCKET");
    }
   
    /**
     * 文件存储方式
     * @return string
     */
    private static function getOssType()
    {
        return 's3';
    }
   
    /**
     * 允许文件上传的后缀
     * @return string[]
     */
    private static function enableUploadExt()
    {
        $string = "jpg|png|jpeg|zip|pdf";
        return explode("|", $string);
    }
   
    /**
     * 获取存储分类文件夹
     * @return string
     */
    private static function getFileDist($fileType = "image")
    {
        switch ($fileType) {
            case "image":
                $disk = "images";
                break;
            case "video":
                $disk = "videos";
                break;
            case "audio":
                $disk = "audios";
                break;
            case "private": //如果是重要文件,可单独进行处理,目的不让此类文件可公网访问,比如支付秘钥,身份证信息之类的
                $disk = "private";
                break;
            default:
                $disk = "others";
                break;
        }
        return $disk;
    }
}

有兴趣可以自行测试一下

相关文章