一、连接Minio服务器
Minio是一个开源的S3兼容对象存储系统。为了进行文件下载,我们需要连接到Minio服务器。
首先,我们需要在代码中设置Minio服务器的地址、AccessKey和SecretKey:
import (
"github.com/minio/minio-go/v7"
"log"
"context"
)
func main() {
endpoint := "minio.example.com:9000"
accessKey := "ACCESS_KEY"
secretKey := "SECRET_KEY"
// Initialize minio client object.
minioClient, err := minio.New(endpoint, &minio.Options{
Credentials: &minio.Credentials{
AccessKey: accessKey,
SecretKey: secretKey,
}},
)
if err != nil {
log.Fatalln(err)
}
// Use the minioClient object to make calls to the API.
ctx := context.Background()
_, err = minioClient.ListBuckets(ctx)
if err != nil {
log.Fatalln(err)
}
}
以上代码中,我们通过minio.New()函数创建了Minio客户端对象,并在参数中传入了服务器地址、AccessKey和SecretKey。之后我们使用该对象进行其他操作,例如检查连接是否正常。
二、获取文件信息
在进行文件下载之前,我们需要获取该文件的信息,例如文件名、文件大小等。
我们可以使用Minio的StatObject()函数来获取文件信息:
func main() {
// ...
bucketName := "my-bucket"
objectName := "my-object"
// Get object information.
info, err := minioClient.StatObject(ctx, bucketName, objectName, minio.StatObjectOptions{})
if err != nil {
log.Fatalln(err)
}
fmt.Println(info)
}
三、下载文件
一旦我们获取了文件信息,就可以开始下载文件。Minio库提供了多种下载方式,下面介绍几种最常用的下载方式。
1. 下载到本地文件
使用FGetObject()函数可以将文件下载到本地磁盘:
func main() {
// ...
bucketName := "my-bucket"
objectName := "my-object"
filePath := "my-object.txt"
// Download object to file.
err = minioClient.FGetObject(ctx, bucketName, objectName, filePath, minio.GetObjectOptions{})
if err != nil {
log.Fatalln(err)
}
}
以上代码中,FGetObject()函数中的参数分别为:Bucket名称、文件名、本地文件路径和下载选项。下载选项可以用于指定文件的偏移量、字节数等。
2. 下载到内存
如果不想将文件下载到本地磁盘,可以使用GetObject()函数将文件下载到内存中:
func main() {
// ...
bucketName := "my-bucket"
objectName := "my-object"
// Download object to buffer.
buf := bytes.NewBuffer(nil)
_, err = minioClient.GetObject(ctx, bucketName, objectName, minio.GetObjectOptions{}, buf)
if err != nil {
log.Fatalln(err)
}
fmt.Println(buf.String())
}
以上代码中,GetObject()函数将文件下载到一个缓冲区中,并返回缓冲区的长度和错误信息。此时,可以通过buf.String()获取文件的内容。
四、使用Presigned URL进行下载
如果需要将文件分享给其他人下载,可以使用Presigned URL。Presigned URL是具有时间限制的URL,可以让外部人员在指定时间段内下载文件。
使用PresignedGetObject()函数可以生成Presigned URL:
func main() {
// ...
bucketName := "my-bucket"
objectName := "my-object"
expires := time.Second * 60 // URL有效期为1分钟
// Generate presigned URL to download object.
url, err := minioClient.PresignedGetObject(ctx, bucketName, objectName, expires, nil)
if err != nil {
log.Fatalln(err)
}
fmt.Println(url)
}
以上代码中,PresignedGetObject()函数中的参数分别为:Bucket名称、文件名、URL有效期和一些可选参数,例如Response-Content-Disposition。
五、小结
通过以上几种方式,我们可以轻松地实现Minio文件下载功能。无论是下载到本地磁盘还是下载到内存中,只需要调用相应的函数即可。如果需要将文件分享给其他人下载,Presigned URL是非常方便的选择。