亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 GoLang 將結構或對象上傳到 S3 存儲桶?

使用 GoLang 將結構或對象上傳到 S3 存儲桶?

Go
紅顏莎娜 2022-09-05 17:03:47
我正在 GoLang 中使用 AWS S3 開發工具包,將上傳和下載到各種存儲桶。我想知道是否有更簡單的方法將結構或對象直接上傳到存儲桶?我有一個表示事件的結構:type Event struct {    ID               string    ProcessID        string                     TxnID            string    Inputs           map[string]interface{}                      }我想上傳到S3存儲桶中。但我在文檔中找到的代碼僅適用于上傳字符串。func Save(client S3Client, T interface{}, key string) bool {    svc := client.S3clientObject    input := &s3.PutObjectInput{        Body: aws.ReadSeekCloser(strings.NewReader("testing this one")),        Bucket: aws.String(GetS3Bucket()),        Key: aws.String(GetObjectKey(T, key)),        Metadata: map[string]*string{            "metadata1": aws.String("value1"),            "metadata2": aws.String("value2"),        },    }這成功地將基本文件上傳到S3存儲桶,打開該文件時只需顯示“測試此文件”。有沒有辦法上傳到存儲桶,以便它上傳一個對象,而不僅僅是一個字符串值?任何幫助都是值得贊賞的,因為我是Go和S3的新手。編輯這是我用于 Get 函數的代碼:func GetIt(client S3Client, T interface{}, key string) interface{} {    svc := client.S3clientObject    s3Key := GetObjectKey(T, key)    resp, err := svc.GetObject(&s3.GetObjectInput{        Bucket: aws.String(GetS3Bucket()),        Key: aws.String(s3Key),    })    if err != nil {        fmt.Println(err)        return err    }        result := json.NewDecoder(resp.Body).Decode(&T)    fmt.Println(result)     return json.NewDecoder(resp.Body).Decode(&T)}func main() {    client := b.CreateS3Client()    event := b.CreateEvent()    GetIt(client, event, key)}
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

將值編碼為字節并上傳字節。下面介紹如何將值編碼為 JSON 字節:


func Save(client S3Client, value interface{}, key string) error {


    p, err := json.Marshal(value)

    if err != nil {

        return err

    }

    input := &s3.PutObjectInput{

        Body:   aws.ReadSeekCloser(bytes.NewReader(p)),

        …

    }

    …

}

使用要上傳的值調用保存:


value := &Event{ID: "an id", …}

err := Save(…, value, …)

if err != nil {

  // handle error

}

有很多可能,包括gob,xml和json,msgpack等。最佳編碼格式將取決于您的應用程序要求。


獲取對象時反轉該過程:


func GetIt(client S3Client, T interface{}, key string) error {

    svc := client.S3clientObject

    resp, err := svc.GetObject(&s3.GetObjectInput{

        Bucket: aws.String(GetS3Bucket()),

        Key: aws.String(key),

    })

    if err != nil {

        return err

    }    

    return json.NewDecoder(resp.Body).Decode(T)

}

使用指向目標值的指針調用 GetIt:


var value model.Event

err := GetIt(client, &value, key)

if err != nil {

    // handle error

}

fmt.Println(value) // prints the decoded value.


查看完整回答
反對 回復 2022-09-05
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

此處引用的示例表明,S3 允許您上傳實現 io 的任何內容。讀取器接口。該示例使用語法創建一個知道如何向調用方提供指定字符串的語法。您的工作(根據此處的AWS)是弄清楚如何將您需要存儲的任何內容調整為.strings.NewReaderio.Readerio.Reader


您可以直接存儲JSON編碼的字節,如下所示


package main


import (

    "bytes"

    "encoding/json"

)


type Event struct {

    ID               string

    ProcessID        string

    TxnID            string

    Inputs           map[string]interface{}

}


func main() {

    // To prepare the object for writing

    b, err := json.Marshal(event)

    if err != nil {

        return

    }

    // pass this reader into aws.ReadSeekCloser(...)

    reader := bytes.NewReader(b)

}


查看完整回答
反對 回復 2022-09-05
  • 2 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號