使用 GoLang 将结构或对象上传到 S3 存储桶?

我正在 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)

}


红颜莎娜
浏览 154回答 2
2回答

慕码人2483693

将值编码为字节并上传字节。下面介绍如何将值编码为 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.Eventerr := GetIt(client, &value, key)if err != nil {    // handle error}fmt.Println(value) // prints the decoded value.

慕标琳琳

此处引用的示例表明,S3 允许您上传实现 io 的任何内容。读取器接口。该示例使用语法创建一个知道如何向调用方提供指定字符串的语法。您的工作(根据此处的AWS)是弄清楚如何将您需要存储的任何内容调整为.strings.NewReaderio.Readerio.Reader您可以直接存储JSON编码的字节,如下所示package mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go