跳转至

下载对象

背景

用户通过云平台申请的永久aksk,结合开源的minio-go/python SDK将桶中的对象下载到本地

步骤

  • 通过云平台创建永久aksk
  • 通过开源SDK下载对象

云平台创建永久aksk

参考"获取永久aksk"文档

下载对象

方法一:直接下载对象

利用永久aksk,直接将桶中的对象下载到本地

package main

import (
    "context"
    "io"
    "log"
    "os"

    "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/credentials"
)

const (
    AccessKeyID     = "XDZ***********gp2x"
    SecretAccessKey = "iseXX***********************Hm5l"
    obj             = "upload.txt"
    bucket          = "ttt2222"
    storageGateway  = "http://s3.mediacloud.imgo.tv"
)

func main() {
    s3Client, err := minio.New(storageGateway, &minio.Options{
        Creds:  credentials.NewStaticV4(AccessKeyID, SecretAccessKey, ""),
        Secure: true,
    })
    if err != nil {
        log.Fatalln(err)
    }

    reader, err := s3Client.GetObject(context.Background(), bucket, obj, minio.GetObjectOptions{})
    if err != nil {
        log.Fatalln(err)
    }
    defer reader.Close()

    localFile, err := os.Create(obj)
    if err != nil {
        log.Fatalln(err)
    }
    defer localFile.Close()

    stat, err := reader.Stat()
    if err != nil {
        log.Fatalln(err)
    }

    if _, err := io.CopyN(localFile, reader, stat.Size); err != nil {
        log.Fatalln(err)
    }
}

方法二:通过生成下载地址下载对象
  • 第一步:生成对象下载地址,需要修改aksk,bucket和obj这四个参数

    package main
    
    import (
        "context"
        "log"
        "net/url"
        "time"
    
        "github.com/minio/minio-go/v7"
        "github.com/minio/minio-go/v7/pkg/credentials"
    )
    
    const (
        AccessKeyID     = "XDZ***********gp2x"
        SecretAccessKey = "iseXX***********************Hm5l"
        obj             = "upload.txt"
        bucket          = "ttt2222"
        storageGateway  = "http://s3.mediacloud.imgo.tv"
    )
    
    func main() {
        s3Client, err := minio.New(storageGateway, &minio.Options{
            Creds:  credentials.NewStaticV4(AccessKeyID, SecretAccessKey, ""),
            Secure: true,
        })
        if err != nil {
            log.Fatalln(err)
        }
    
        // Set request parameters
        reqParams := make(url.Values)
        att := fmt.Sprintf("attachment; filename=\"%s\"", obj)
        reqParams.Set("response-content-disposition", att)
    
        // Gernerate presigned get object url.
        presignedURL, err := s3Client.PresignedGetObject(context.Background(), bucket, obj, time.Duration(1000)*time.Second, reqParams)
        if err != nil {
            log.Fatalln(err)
        }
        log.Println(presignedURL)
    }
    

  • 第二步,用第一步生成的下载地址下载对象,url改成第一步返回的结果,obj是需要下载的对象

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "os"
    )
    
    const (
        url = ""
        obj = "upload.txt"
    )
    
    func main() {
    
        url := ""
        method := "GET"
    
        client := &http.Client{}
        req, err := http.NewRequest(method, url, nil)
    
        if err != nil {
            fmt.Println(err)
            return
        }
        req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
        req.Header.Add("Accept-Language", "zh-CN,zh;q=0.9")
        req.Header.Add("Connection", "keep-alive")
        req.Header.Add("Upgrade-Insecure-Requests", "1")
        req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36")
    
        res, err := client.Do(req)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer res.Body.Close()
    
        body, err := ioutil.ReadAll(res.Body)
        if err != nil {
            fmt.Println(err)
            return
        }
        // fmt.Println(string(body))
    
        f, err := os.Create(obj)
        if err != nil {
            fmt.Println(err)
            return
        }
        n, err := f.Write(body)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Printf("write %d bytes", n)
    }