LoginSignup
6
2

More than 3 years have passed since last update.

Goでbase64を画像でS3へアップロードする

Last updated at Posted at 2019-09-17

はじめに

意外にbase64をバッファに書き込んでアップロードする記事がなかったので書く!
急いでる人は一番下にコード載せてるんでそれで!

前提

  • フロントからjson等でstringで画像を変換したbase64が送られてくる事
  • 拡張子も一緒に送られる事
  • go get -u github.com/kelseyhightower/envconfig

kelseyhightower/envconfig

kelseyhightower/envconfig
このパッケージで環境変数を扱いやすくする。


type Env struct {
    S3AK string
    S3SK string
}

この様に構造体を定義しておくと


var env Env
envconfig.Process("", &env)
env.S3AK // = 環境変数に設定したS3AK
env.S3SK // = 環境変数に設定したS3SK

で、環境変数に設定してある S3AK (アクセスキー)と S3SK (シークレットキー)が取得できます。
詳しくはgithubを確認して下さい。(もちろんS3AKとかじゃなくて名前はなんでも大丈夫です!)

base64をバッファに書き込む

フロントから送られてきたbase64をまずはバッファに書き込んであげましょう!
ここのS3Serviceは定義しなくても大丈夫です。

引数はimageBase64はあれで, fileExtensionには拡張子が入ってるとします。


func(s3 S3Service) UploadS3(imageBase64 string, fileExtension string) error {
    data, _ = base64.StdEncoding.DecodeString(imageBase64)
    wb := new(bytes.Buffer)
    wb.Write(data)    
}

これだけでもう準備できました!(エラーは握り潰してます。。w)

次はS3のCredentialとUploaderの作成です!

S3

先ほど説明したenvconfigを使いましょう!


func(s3 S3Service) UploadS3(imageBase64 string, fileExtension string) error {
    var env Env
    _ = envconfig.Process("", &env)

    sess := session.Must(session.NewSession(&aws.Config{
        Credentials: credentials.NewStaticCredentials(env.S3AK, env.S3SK, ""),
        Region: aws.String("ap-northeast-1")
    }))

    uploader := s3manager.NewUploader(sess)

}

これであとはアップロードするだけです!!

最終的

func (s S3Service) UploadToS3(imageBase64 string, fileExtension string) error {
    // 環境変数からS3Credential周りの設定を取得
    var env Env
    bucketName := "バケット名"
    _ = envconfig.Process("", &env)

    sess := session.Must(session.NewSession(&aws.Config{
        Credentials: credentials.NewStaticCredentials(env.S3AK, env.S3SK, ""),
        Region:      aws.String("ap-northeast-1"),
    }))

    uploader := s3manager.NewUploader(sess)

    data, _ := base64.StdEncoding.DecodeString(imageBase64)
    wb := new(bytes.Buffer)
    wb.Write(data)

    res, err := uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String("ファイル名" + "." + fileExtension),
        Body:   wb,
        ContentType: aws.String("image/" + fileExtension),
    })

    if err != nil {
        fmt.Println(res)
        if err, ok := err.(awserr.Error); ok && err.Code() == request.CanceledErrorCode {
            return RaiseError(400, "Upload TimuOut", nil)
        } else {
            return RaiseError(400, "Upload Failed", nil)
        }
    }

    return nil
}

これでアップロードはできます!!
エラーハンドリングは今から頑張りたいです。。。

6
2
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
6
2