上传对象
背景¶
用户通过云平台申请的永久aksk,结合开源的minio-go/python SDK将用户的任何对象上传到对象存储中
步骤¶
- 通过云平台创建永久aksk
- 通过开源SDK上传对象到对象存储种
云平台创建永久aksk¶
参考"获取永久aksk"文档
上传对象¶
方法一:直接上传对象¶
利用永久aksk,直接将对象推到对应的桶里面
package main
import (
"context"
"log"
"os"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
const (
AccessKeyID = "XDZ***********gp2x"
SecretAccessKey = "iseXX***********************Hm5l"
uploadObj = "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)
}
object, err := os.Open(uploadObj)
if err != nil {
log.Fatalln(err)
}
defer object.Close()
objectStat, err := object.Stat()
if err != nil {
log.Fatalln(err)
}
n, err := s3Client.PutObject(context.Background(), bucket, uploadObj, object, objectStat.Size(), minio.PutObjectOptions{ContentType: "application/octet-stream"})
if err != nil {
log.Fatalln(err)
}
log.Println("Uploaded", "my-objectname", " of size: ", n, "Successfully.")
}
方法二:通过生成上传地址上传对象¶
-
第一步:生成对象上传地址,需要修改aksk,bucket和uploadobj这四个参数
package main import ( "context" "fmt" "net/url" "time" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) const ( AccessKeyID = "XDZ***********gp2x" SecretAccessKey = "iseXX***********************Hm5l" uploadObj = "upload.txt" bucket = "ttt2222" storageGateway = "http://s3.mediacloud.imgo.tv" ) // NewMinioClient creates a new MinIO client based on the ConsoleCredentials extracted // from the provided session token func NewMinioClient() (*minio.Client, error) { u, err := url.Parse(storageGateway) if err != nil { return nil, err } minioClient, err := minio.New(u.Host, &minio.Options{ Creds: credentials.NewStaticV4(AccessKeyID, SecretAccessKey, ""), Secure: false, }) if err != nil { return nil, err } return minioClient, nil } func main() { minioCli, err := NewMinioClient() if err != nil { fmt.Errorf("NewMinioClient err:%v", err) } bucketName := bucket objName := uploadObj // Set request parameters att := fmt.Sprintf("attachment; filename=\"%s\"", objName) reqParams := make(url.Values) reqParams.Set("response-content-disposition", att) presignedURL, err := minioCli.PresignedGetObject(context.Background(), bucketName, objName, 1000*time.Second, reqParams) if err != nil { fmt.Printf("PresignedGetObject err:%v", err) } else { fmt.Printf("presignedURL:%+v\n", presignedURL) } }
-
第二步,用第一步生成的上传地址上传对象,url改成第一步返回的结果,uploadObj是需要上传的对象
package main import ( "fmt" "io/ioutil" "net/http" "strings" ) const ( url := "第一步生成的地址" uploadObj = "upload.txt" ) func main() { method := "PUT" bt, err := ioutil.ReadFile(uploadObj) if err != nil { fmt.Println(err) return } payload := strings.NewReader(string(bt)) client := &http.Client{} req, err := http.NewRequest(method, url, payload) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "text/plain") 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)) }