laravel9 + minio对象存储文件上传流程步骤示例代码
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;
}
}
有兴趣可以自行测试一下
相关文章