您的位置 首页 php

php使用AWS操作MinIO Server,实现文件的上传(分片上传)下载

MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。 它是与 Amazon S3 云存储服务兼容的 API。 使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。

具体中文文档地址

1、安装minIO Server

这里minIO的服务我们采用docker的方式进行安装

注意 /Users/robing/data 是我自己电脑的目录,大家可以根据自己的环境设定,也可以不指定

运行之后可以访问 进行登录 用刚刚设定的密码 admin / admin123456

登录界面

创建授权用户

就可以拿到

  • Access Key: ZO0AHGDD9RS0IZPYJ05A
  • Secret Key: HYaryObjstEeIRrVVIDUqrwZ5V72tTJ+WwFpKpd4

创建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' => '#39;,
        '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->createMultipart Upload (['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以下的不需要分片,可直接进行上传。

有问题可以下方留言谈论!

文章来源:智云一二三科技

文章标题:php使用AWS操作MinIO Server,实现文件的上传(分片上传)下载

文章地址:https://www.zhihuclub.com/150196.shtml

关于作者: 智云科技

热门文章

网站地图