はじめに
意外に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
}
これでアップロードはできます!!
エラーハンドリングは今から頑張りたいです。。。