为了账号安全,请及时绑定邮箱和手机立即绑定

使用 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 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信