0
0

【Golang】base64でエンコードされたデータをデコードして、AWS S3にアップロードする

Posted at

概要

Goを使って、Base64でエンコードされた文字列をJSONで受け取り、S3にアップロードしてみます。APIアクセス周りはEchoを使いました。
ファイルをS3にアップロードする際に、クライアントサイド/サーバーサイドのどちらから行うのか、またデータをどのようにやりとりするのか、などの観点で色々方法はあると思いますが、今回はBase64文字列をJSONで受け取り、デコードしてS3にアップロードする方法を試してみました。

参考:ファイルをS3にアップロードするときはサーバー?クライアント?

バージョン

  • Echo:4.5.0
  • Go:1.17.1

ファイル構成

main.go
aws/
  ├ config.go
  └ s3.go

aws-sdk-goのインストール

go get -u github.com/aws/aws-sdk-go

config.go

以下のように、awsのアクセスのための環境変数を読み込めるよう設定しておきます。

config.go
package aws

type AwsConfig struct {
	AwsRegion          string
	AwsAccessKeyID     string
	AwsSecretAccessKey string
}

func NewConfig() *AwsConfig {
	return &AwsConfig{
		AwsRegion:          os.Getenv("AWS_REGION"),
		AwsAccessKeyID:     os.Getenv("AWS_ACCESS_KEY_ID"),
		AwsSecretAccessKey: os.Getenv("AWS_SECRET_ACCESS_KEY"),
	}
}

s3.go

データのアップロードの処理を書いていきます。

type S3 struct {
	AwsConfig *AwsConfig
	Uploader  *s3manager.Uploader
}

func NewS3(c *AwsConfig) *S3 {
	sess := session.Must(session.NewSession(&aws.Config{
		Credentials:      credentials.NewStaticCredentials(c.AwsAccessKeyID, c.AwsSecretAccessKey, ""),
		Region:           aws.String(c.AwsRegion),
		S3ForcePathStyle: aws.Bool(true),
	}))
	return &S3{
		AwsConfig: c,
		Uploader:  s3manager.NewUploader(sess),
	}
}

func (u *S3) UploadPhotostockImage(image string) (string, error) {
	data, _ := base64.StdEncoding.DecodeString(image)
	wb := new(bytes.Buffer)
	wb.Write(data)

	filename := "test.png"
	result, err := u.Uploader.Upload(&s3manager.UploadInput{
		ACL:         aws.String("public-read"),
		Bucket:      aws.String("*****"),
		Key:         aws.String("*****/" + filename),
		ContentType: aws.String("png"),
		Body:        wb,
	})
	if err != nil {
		return "", err
	}

	return aws.StringValue(&result.Location), nil
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0