はじめに
画像をGCSアップロードする際、画像をフロント側から
- **「multipart/form-data」**で受けとる記事は多くはあったのですが、
- **「Base64(json)」**で受け取るものが見当たらなかったので、こちらを実装してみました。
本記事のゴール
「GOを使って、フロント側からbase64で受け取った画像をGCSにアップロードすること」
動作環境
go 1.17
目次
準備
jsonKeyの取得
取得した~~~.jsonをルート直下に配置します。(どこでも良いです)
main.go
gstorage.go
~~~.json
細かい取得手順は割愛します。自分は以下記事を参考にさせていただきました
Google Cloud Storageの接続設定
用語確認
-
bucket
: storageのバケット名 -
object
: アップロード後のファイル名
objectはアップロード後のファイル名であることに注意してください。
sdkインストール
以下コマンドでインストールできます。
go get -u cloud.google.com/go/storage
ソースコード
func UploadFile(bucket string, object string, imgBase64 string) error {
credentialFilePath := "./~~~.json"
ctx := context.Background()
client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialFilePath))
if err != nil {
return fmt.Errorf("storage.NewClient: %v", err)
}
defer client.Close()
decodedImage, err := base64.StdEncoding.DecodeString(imgBase64)
if err != nil {
return fmt.Errorf("DecodeString: %v", err)
}
decodedReader := bytes.NewReader(decodedImage)
wc := client.Bucket(bucket).Object(object).NewWriter(ctx)
if _, err = io.Copy(wc, decodedReader); err != nil {
fmt.Errorf("io.Copy:%v", err)
}
if err := wc.Close(); err != nil {
fmt.Errorf("wc.Close:%v", err)
}
fmt.Printf("Blob %v uploaded \n", object)
return nil
}
解説
client生成
はじめにcredentialFileのpathを指定して、
ctxという名前のコンテキストやclientを生成します。
credentialFilePath := "./~~~.json"
ctx := context.Background()
client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialFilePath))
if err != nil {
return fmt.Errorf("storage.NewClient: %v", err)
}
[ ]byteに変換
次にフロント側から受け取ったbase64をdecodeして、[ ]byte型にします。
decodedImage, err := base64.StdEncoding.DecodeString(imgBase64)
if err != nil {
return fmt.Errorf("DecodeString: %v", err)
}
ちなみに
StdEncoding
とRawStdEncoding
の違いは、
base64文字列に「=」(padding)を含むか含まないか、みたいです
参考) 技術向上
あとは公式通りにやればできました。
【google公式】オブジェクトのアップロード
補足
multipart/form-data
ちなみにmultipart/form-data
形式で送る際は、
ファイルを送信する場合、requestsのヘッダーに「multipart/form-data」を設定する必要があるため、JSONをJSONとして送れない
参考)【Python】RequestsでJSONデータと画像ファイルのPOST送信と取得
みたいです。こちらの記事にあるようにjsonっぽく受け取る方法もあるみたいです。
本記事を通して間違っているところがございましたらご指摘いただければと思います!
参考サイト
本記事作成にあたって他に以下のサイトを参考にさせていただきました
【google公式】オブジェクトのアップロード
GAE/GOからmultipart/form-dataでGCSに画像をアップロードする
Go言語(golang)でGoogle Cloud Storageへファイルをアップロードする
GolangでGoogle Cloud Storageに画像やファイルをアップロードする(os.Setenvで環境変数GOOGLE APPLICATION CREDENTIALSを設定する)