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

1 回复

更多关于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官方文档

回到顶部