一 : 安装minio参考 centos7 安装minio + supervisor
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。
二: 安装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"
(1)AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 就是minio web客户端登录时使用的 Access Key和Secret Key
(2)endpoint 新创建的配置文件默认没有这个配置项,需要手动添加(至少我是这样的),添加的就是minio的访问地址
(3)具体的配置项可以参考AWS SDK for PHP版本 3 的配置
三 使用:
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; }