如何将S3数据加载到本地内存中,而不是保存到文件中

时间:2018-08-24 20:38:41

标签: amazon-web-services go amazon-s3

这是我当前的代码:

import (
  "time"
  "reflect"
  "io/ioutil"
  "fmt"
  "os"
  "github.com/golang/protobuf/proto"
  "github.com/aws/aws-sdk-go/service/s3"
  "github.com/aws/aws-sdk-go/service/s3/s3manager"
  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/aws/credentials"
)

f, err := os.Create(filename)
if err != nil {
  panic(fmt.Errorf("failed to create file %q, %v", filename, err))
}
_, err = db.Downloader.Download(f, &s3.GetObjectInput{
    Bucket: aws.String("bucketName"),
    Key:    aws.String("myKeyThatMightExist"),
})
if err != nil { // key doesn't exist
  os.Remove(filename)
  return nil
} else {
  file, err = ioutil.ReadFile(filename)
}

我需要file是从S3下拉的字符串。我要存储的本地文件是S3上的内容的缓存。

这意味着当我尝试提取数据时,需要为该数据创建一个文件。由于要使用的数据库,我实际上不知道我正在访问的密钥是否存在。我想知道以下解决方案中的任何一种是否可行:1)创建某种类型的缓冲区对象,以将整个文件加载到RAM中,而无需实际保存。 2)检查文件是否存在于S3上,而不创建本地文件。这样一来,如果文件不存在,我就可以将其拉下来;如果S3不存在,则不创建空文件。

对不起,但我无法创建游乐场链接,因为去游乐场没有该示例所需的库。

谢谢,尼尔

1 个答案:

答案 0 :(得分:1)

buf := aws.NewWriteAtBuffer([]byte{})
downloader.Download(buf, &requestInput)

现在您可以使用buf.Bytes()

https://docs.aws.amazon.com/sdk-for-go/api/aws/#NewWriteAtBuffer