跳转至

上传对象

背景

用户通过云平台申请的永久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))
    }