您的位置:

Minio文件下载详解

一、连接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是非常方便的选择。