Help us understand the problem. What is going on with this article?

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

はじめに

意外に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
}

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away