1 创建目录
#安装mini目录
mkdir /usr/local/minio
#存放数据
mkdir /usr/local/minio/data
2 进入安装目录
cd /usr/local/minio
3下载minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
4 赋权限
chmod +x minio
5 配置 supervisor
[program:minio]
command = /usr/local/minio/minio server /usr/local/minio/data
user = root
;supervisor启动的时候是否随着同时启动,默认True
autostart = true
;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
autorestart = true
;这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs = 5
;把stderr重定向到stdout,默认 false
redirect_stderr = true
;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
stopasgroup = true
;默认为false,向进程组发送kill信号,包括子进程
killasgroup = true
;stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
;stdout日志文件备份数
stdout_logfile_backups = 10
;日志输出
stdout_logfile = /var/log/supervisor/minio.log
supervisor修改配置文件之后,执行如下命令
supervisorctl reload
6 开放公共链接
如果前端想通过文件链接直接下载浏览图片,需要配置minio bucket策略,默认情况下,minio没有配置匿名读写的权限。
如下图所示,在bucket菜单栏中点击Edit policy,新增Read权限,即可通过链接的方式直接访问该文件。
访问格式 域名+端口+bucket名称+文件名
7修改MINIO_ACCESS_KEY、 MINIO_SECRET_KEY
#Access key长度最小是5个字符
export MINIO_ACCESS_KEY=xxxxxx
#Secret key长度最小是8个字符
export MINIO_SECRET_KEY=12345678
注:如果使用surpervisor已经启动了minio,需要关闭surpervisor的所有后台任务,然后kill掉surpervisor,最后重启surpervisor,相关命令如下:
#supervisorctl 停止所有后台任务
supervisorctl stop all
#查看supervisor PID
pgrep supervisor
#杀掉supervisor进程
kill -9 xxxpid
#重启supervisor
supervisord -c /etc/supervisord.conf
minio是基于Apache Licence v2.0开源协议的对象存储服务,兼容亚马逊S3云存储服务接口,minio官方只提供了js、java、python、Golang、.Net的SDK,并未提供PHP版的SDK,不过因为兼容亚马逊S3云存储服务接口,所以可以使用亚马逊提供的aws-sdk-php SDK,具体可参考Minio Cookbook 中文版。
AWS针对laravel使用aws-sdk-php又做了再次封装,github地址为aws-sdk-php-laravel。
1 composer.json 添加
{
"require": {
"aws/aws-sdk-php-laravel": "~3.0"
}
}
执行composer 更新命令
php composer.phar update
2 配置config/app.php 和 AWS Facade
'providers' => array(
// ...
Aws\Laravel\AwsServiceProvider::class,
)
'aliases' => array(
// ...
'AWS' => Aws\Laravel\AwsFacade::class,
)
3 生成configuration文件
php artisan vendor:publish --provider="Aws\Laravel\AwsServiceProvider"
aws-sdk-php-laravel中给的demo比较简单,实际开发可能会使用更多的功能,具体参考AWS SDK for PHP 3.x。
下面给出几个我自己编写的工具方法,仅供参考,其他的都是一个套路。
1 多张图片同时上传
/**
* 多图上传
* @param $request
* @param string $field
* @return array|null
*/
public function multipleStoragePhoto($request, $field = "uploadFile")
{
if (!$request->hasFile($field)) {
return null;
}
$files = $request->file('uploadFile');
#路径数组
$keyArr = array();
$s3 = AwsFacade::createClient('s3');
foreach ($files as $photo) {
if ($photo->isValid()) {
//文件扩展名
$extend = $photo->extension();
# 自定义文件名
$fileName = date('Ymd') . '-' . uniqid() . '.' . $extend;
$s3_return = $s3->putObject([
'Bucket' => 'bucket_test', //存储桶名称
'Key' => $fileName, //文件名(包括后缀名)
'Body' => file_get_contents($photo) //要上传的文件
]);
if ($s3_return['@metadata']['statusCode'] == 200) {
$keyArr[] = 'bucket_test' . '/' . $fileName;
} else {
\Log::info('图片上传失败');
continue;
}
}
}
return $keyArr;
}
2 删除图片
/**
* 删除图片
* @param $url
*/
public function deletePhoto($url)
{
$s3 = AwsFacade::createClient('s3');
$s3->deleteObject([
'Bucket' => 'bucket_test', //存储桶名称
'Key' => strrchr($url, '/'), //文件名 去掉time-management
]);
}
3 批量删除图片
/**
* 删除多张图片
* @param $urls
*/
public function deletePhotos($urls)
{
$keys = array();
foreach ($urls as $url) {
$keys[] = array('Key' => strrchr($url, '/'));
}
$s3 = AwsFacade::createClient('s3');
$s3->deleteObjects([
'Bucket' => 'bucket_test', //存储桶名称
'Delete' => [ 'Objects' => $keys ] ]);
}
4 批量复制
/**
* 批量复制图片
* @param $sourceUrls
* @return array key数组
*/
public function copyPhotos($sourceUrls)
{
$keyArr = array();
$s3 = AwsFacade::createClient('s3');
foreach ($sourceUrls as $sourceUrl) {
#文件扩展名
$extend = strrchr($sourceUrl, '.');
# 自定义文件名
$fileName = date('Ymd') . '-' . uniqid() . $extend;
$s3->copyObject([
'Bucket' => 'bucket_test', //存储桶名称
'CopySource' => $sourceUrl,
'Key' => $fileName,
]);
$keyArr[] = 'bucket_test' . '/' . $fileName;
}
return $keyArr;
}