php使用AWS操作MinIO Server,实现文件的上传(分片上传)下载
MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。 它是与 Amazon S3 云存储服务兼容的 API。 使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。详细中文文档地址 MinIO Quickstart Guide| Minio中文文档
1、安装minIO Server
这里minIO的服务我们接纳docker的方式举行安装
docker run -p 9000:9000 -p 9001:9001 --name minio1 -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123456" -v /Users/robing/data:/data minio/minio server /data --console-address ":9001"
注意 /Users/robing/data 是我自己电脑的目录,大家可以根据自己的环境设定,也可以不指定
运行之后可以访问 http://127.0.0.1:9001 举行登录 用刚刚设定的密码 admin / admin123456
https://p9.toutiaoimg.com/large/pgc-image/0d7dc2c2244542a5bc4406c444fc3eee登录界面
https://p6.toutiaoimg.com/large/pgc-image/70e0ec6f2ae64ba6a431cab63a07116f创建授权用户
就可以拿到
[*]Access Key: ZO0AHGDD9RS0IZPYJ05A
[*]Secret Key: HYaryObjstEeIRrVVIDUqrwZ5V72tTJ+WwFpKpd4
https://p9.toutiaoimg.com/large/pgc-image/aae1716225b24ad0838bd86eeb994535创建buck
2、PHP项目下载 aws/aws-sdk-php包
composer require aws/aws-sdk-php
3、上传
1)普通上传
$client = new S3Client([ 'version' => 'latest', // 用于锁定API版本 'region' => '', // 'use_path_style_endpoint' => true, 'signature_version' => 'v4', // 签名版本(minio现在使用v4版本) 'endpoint' => 'http://127.0.0.1:9000', 'credentials' => ['key' => 'ZO0AHGDD9RS0IZPYJ05A', 'secret' => 'HYaryObjstEeIRrVVIDUqrwZ5V72tTJ+WwFpKpd4']]);}$storeKey = '2021/08/29/test.zip'; // 可以自行设定$fileData = '123123'; // 文件上传内容$params = ['Bucket' => 'robing', 'Key' => $storeKey, 'Body' => $fileData];$res = $client->putObject();2) 分片上传
$uploadResult = $client->createMultipartUpload(['Bucket' => ’robing', 'Key' => $storeKey]);$UploadId=$uploadResult['UploadId']; // 分片上传必要指定对应的上传ID$params = [ 'Bucket' => 'robing', 'Key' => $storeKey, 'Body' => $fileData, // 分片内容 'PartNumber' =>1, // 当前上传分片数 'UploadId' => $metaData['UploadId'],];$res = $client->uploadPart($params);$ETag = $res['ETag']; // 这个分片tag必要举行存储,合成分片的时候必要全部的ETag// 好比我这里用redis 举行存储$redis[文件唯一标识]['ETagList'][] = ['PartNumber' => 详细分片数(1,2,3,4) , 'ETag' => $ETag];// 当最后一个分片的时候必要举行合成分片// 最后一个分片 举行分片合成$res = $client->completeMultipartUpload([ 'Bucket' => 'robing', 'Key' => $storeKey, 'MultipartUpload' => [ 'Parts' => $redis[文件唯一标识]['ETagList'] ], 'UploadId' => $redis[文件唯一标识]['UploadId'],]);4、下载文件
$command = $client->getCommand('GetObject', [ 'Bucket' => 'robing', 'Key' => $storeKey // 上面我们上传实用的 $storeKey]);$request = $this->getClient()->createPresignedRequest($command, sprintf("+%d seconds", 600));$url =(string)$request->getUri();以上为简单的实现,详细的详细参数可以查看文档
这里备注一个特别注意的问题,就是minio最小分片数为5M,在上传分片的时候如果不足5M会有问题,所以在切割分片的时候,要保证每个分片都是5M以上 ,5M以下的不必要分片,可直接举行上传。
有问题可以下方留言评论!
页:
[1]