下载对象
背景¶
用户通过云平台申请的永久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) }