概要
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
}