golang实现Amazon S3兼容云存储操作的插件库minio-go的使用
Golang实现Amazon S3兼容云存储操作的插件库minio-go的使用
简介
MinIO Go Client SDK提供了简单的API来访问任何兼容Amazon S3的对象存储服务。本指南将介绍如何安装MinIO客户端SDK、连接到MinIO以及创建一个示例文件上传程序。
安装
从项目目录执行以下命令安装minio-go库:
go get github.com/minio/minio-go/v7
初始化MinIO客户端对象
MinIO客户端需要以下参数来连接到Amazon S3兼容的对象存储:
参数 | 描述 |
---|---|
endpoint |
对象存储服务的URL |
_minio.Options_ |
所有选项,如凭证、自定义传输等 |
package main
import (
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
endpoint := "play.min.io"
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
useSSL := true
// 初始化minio客户端对象
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
log.Printf("%#v\n", minioClient) // minioClient现在已设置好
}
示例 - 文件上传器
这个示例代码连接到对象存储服务器,创建一个存储桶,并上传一个文件到该存储桶。它使用MinIO的play
服务器,这是一个位于play.min.io
的公共MinIO集群。
play
服务器运行最新稳定版本的MinIO,可用于测试和开发。此示例中显示的访问凭证是公开的,上传到play
的所有数据都应视为公开且不受保护。
FileUploader.go
这个示例执行以下操作:
- 使用提供的凭证连接到MinIO
play
服务器 - 创建一个名为
testbucket
的存储桶 - 从
/tmp
上传一个名为testdata
的文件 - 使用
mc ls
验证文件是否已创建
// FileUploader.go MinIO示例
package main
import (
"context"
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
ctx := context.Background()
endpoint := "play.min.io"
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
useSSL := true
// 初始化minio客户端对象
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
// 创建一个名为testbucket的新存储桶
bucketName := "testbucket"
location := "us-east-1"
err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location})
if err != nil {
// 检查是否已经拥有这个存储桶(如果运行两次会发生这种情况)
exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
if errBucketExists == nil && exists {
log.Printf("We already own %s\n", bucketName)
} else {
log.Fatalln(err)
}
} else {
log.Printf("Successfully created %s\n", bucketName)
}
// 上传测试文件
// 如果文件在另一个位置,请更改filePath的值
objectName := "testdata"
filePath := "/tmp/testdata"
contentType := "application/octet-stream"
// 使用FPutObject上传测试文件
info, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
if err != nil {
log.Fatalln(err)
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
}
1. 创建一个包含数据的测试文件
在Linux或macOS系统上可以使用dd
命令:
dd if=/dev/urandom of=/tmp/testdata bs=2048 count=10
或者在Windows上使用fsutil
:
fsutil file createnew "C:\Users\<username>\Desktop\sample.txt" 20480
2. 使用以下命令运行FileUploader:
go mod init example/FileUploader
go get github.com/minio/minio-go/v7
go get github.com/minio/minio-go/v7/pkg/credentials
go run FileUploader.go
输出类似于:
2023/11/01 14:27:55 Successfully created testbucket
2023/11/01 14:27:55 Successfully uploaded testdata of size 20480
3. 使用mc ls
验证上传的文件:
mc ls play/testbucket
[2023-11-01 14:27:55 UTC] 20KiB STANDARD TestDataFile
API参考
完整的API参考可在此处找到。
API参考:存储桶操作
MakeBucket
ListBuckets
BucketExists
RemoveBucket
ListObjects
ListIncompleteUploads
API参考:存储桶策略操作
SetBucketPolicy
GetBucketPolicy
API参考:存储桶通知操作
SetBucketNotification
GetBucketNotification
RemoveAllBucketNotification
ListenBucketNotification
(MinIO扩展)ListenNotification
(MinIO扩展)
API参考:文件对象操作
FPutObject
FGetObject
API参考:对象操作
GetObject
PutObject
PutObjectStreaming
StatObject
CopyObject
RemoveObject
RemoveObjects
RemoveIncompleteUpload
SelectObjectContent
API参考:预签名操作
PresignedGetObject
PresignedPutObject
PresignedHeadObject
PresignedPostPolicy
API参考:客户端自定义设置
SetAppInfo
TraceOn
TraceOff
完整示例
完整示例:存储桶操作
- makebucket.go
- listbuckets.go
- bucketexists.go
- removebucket.go
- listobjects.go
- listobjectsV2.go
- listincompleteuploads.go
完整示例:存储桶策略操作
- setbucketpolicy.go
- getbucketpolicy.go
- listbucketpolicies.go
完整示例:存储桶生命周期操作
- setbucketlifecycle.go
- getbucketlifecycle.go
完整示例:存储桶加密操作
- setbucketencryption.go
- getbucketencryption.go
- removebucketencryption.go
完整示例:存储桶复制操作
- setbucketreplication.go
- getbucketreplication.go
- removebucketreplication.go
完整示例:存储桶通知操作
- setbucketnotification.go
- getbucketnotification.go
- removeallbucketnotification.go
- listenbucketnotification.go (MinIO扩展)
- listennotification.go (MinIO扩展)
完整示例:文件对象操作
- fputobject.go
- fgetobject.go
完整示例:对象操作
- putobject.go
- getobject.go
- statobject.go
- copyobject.go
- removeobject.go
- removeincompleteupload.go
- removeobjects.go
完整示例:加密对象操作
- put-encrypted-object.go
- get-encrypted-object.go
- fput-encrypted-object.go
完整示例:预签名操作
- presignedgetobject.go
- presignedputobject.go
- presignedheadobject.go
- presignedpostpolicy.go
许可证
此SDK根据Apache License, Version 2.0分发。
更多关于golang实现Amazon S3兼容云存储操作的插件库minio-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现Amazon S3兼容云存储操作的插件库minio-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用minio-go操作Amazon S3兼容云存储
minio-go是MinIO官方提供的Golang客户端库,用于与Amazon S3以及任何S3兼容的对象存储服务进行交互。下面我将详细介绍如何使用minio-go进行常见的云存储操作。
安装minio-go
首先需要安装minio-go库:
go get github.com/minio/minio-go/v7
初始化客户端
package main
import (
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
// 配置MinIO/S3连接参数
endpoint := "play.min.io" // 替换为你的S3服务地址
accessKeyID := "Q3AM3UQ867SPQQA43P2F" // 替换为你的Access Key
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" // 替换为你的Secret Key
useSSL := true
// 初始化客户端
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
log.Printf("%#v\n", minioClient) // minioClient现在可以用于各种操作
}
基本操作示例
1. 创建存储桶(Bucket)
bucketName := "my-new-bucket"
location := "us-east-1" // 对于MinIO可以留空
err = minioClient.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: location})
if err != nil {
// 检查桶是否已存在
exists, errBucketExists := minioClient.BucketExists(context.Background(), bucketName)
if errBucketExists == nil && exists {
log.Printf("Bucket %s already exists\n", bucketName)
} else {
log.Fatalln(err)
}
}
log.Printf("Successfully created bucket %s\n", bucketName)
2. 上传文件
objectName := "testfile.txt"
filePath := "/tmp/testfile.txt"
contentType := "application/octet-stream"
// 上传文件
info, err := minioClient.FPutObject(context.Background(), bucketName, objectName, filePath, minio.PutObjectOptions{
ContentType: contentType,
})
if err != nil {
log.Fatalln(err)
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
3. 下载文件
err = minioClient.FGetObject(context.Background(), bucketName, objectName, "/tmp/downloaded-file.txt", minio.GetObjectOptions{})
if err != nil {
log.Fatalln(err)
}
log.Println("Successfully downloaded file")
4. 列出存储桶中的对象
objectCh := minioClient.ListObjects(context.Background(), bucketName, minio.ListObjectsOptions{
Prefix: "",
Recursive: true,
})
for object := range objectCh {
if object.Err != nil {
log.Println(object.Err)
continue
}
log.Println(object.Key)
}
5. 删除对象
err = minioClient.RemoveObject(context.Background(), bucketName, objectName, minio.RemoveObjectOptions{})
if err != nil {
log.Fatalln(err)
}
log.Printf("Successfully removed %s\n", objectName)
高级功能
1. 生成预签名URL
// 生成7天有效的预签名URL
expires := time.Now().Add(7 * 24 * time.Hour)
presignedURL, err := minioClient.PresignedGetObject(context.Background(), bucketName, objectName, expires, nil)
if err != nil {
log.Fatalln(err)
}
log.Println("Presigned URL:", presignedURL)
2. 分片上传大文件
uploadInfo, err := minioClient.PutObject(context.Background(), bucketName, "largefile.bin", largeFileReader, -1, minio.PutObjectOptions{
ContentType: "application/octet-stream",
PartSize: 5 << 20, // 5MB分片大小
})
if err != nil {
log.Fatalln(err)
}
log.Printf("Uploaded large file %s of size %d\n", uploadInfo.Key, uploadInfo.Size)
3. 设置对象生命周期
err = minioClient.SetBucketLifecycle(context.Background(), bucketName, &lifecycle.Configuration{
Rules: []lifecycle.Rule{
{
ID: "temp-files-expiration",
Status: "Enabled",
Expiration: lifecycle.Expiration{
Days: 7, // 7天后过期
},
Filter: lifecycle.Filter{
Prefix: "temp/",
},
},
},
})
if err != nil {
log.Fatalln(err)
}
错误处理
minio-go返回的错误通常包含详细的S3错误信息:
if err != nil {
if minioErr, ok := err.(minio.ErrorResponse); ok {
log.Printf("S3 Error: %s (Code: %s)\n", minioErr.Message, minioErr.Code)
} else {
log.Printf("Error: %v\n", err)
}
}
总结
minio-go提供了完整的API来操作S3兼容的存储服务,包括:
- 桶管理(创建、删除、列出)
- 对象操作(上传、下载、删除)
- 高级功能(预签名URL、分片上传、生命周期管理)
以上代码示例涵盖了最常见的操作场景,更多高级功能可以参考minio-go官方文档。