2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GO】base64形式で受け取った画像をGCSにアップロードする

Posted at

はじめに

画像をGCSアップロードする際、画像をフロント側から

  1. **「multipart/form-data」**で受けとる記事は多くはあったのですが、
  2. **「Base64(json)」**で受け取るものが見当たらなかったので、こちらを実装してみました。:relieved:

本記事のゴール

GOを使って、フロント側からbase64で受け取った画像をGCSにアップロードすること」

動作環境

go 1.17

目次

準備

jsonKeyの取得

取得した~~~.jsonをルート直下に配置します。(どこでも良いです)

main.go
gstorage.go
~~~.json

細かい取得手順は割愛します。自分は以下記事を参考にさせていただきました:slight_smile:
Google Cloud Storageの接続設定

用語確認

  1. bucket : storageのバケット名
  2. object : アップロード後のファイル名

objectはアップロード後のファイル名であることに注意してください。

sdkインストール

以下コマンドでインストールできます。
go get -u cloud.google.com/go/storage

ソースコード

gstorage.go
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を生成します。

gstorage.go
	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型にします。

gstorage.go
	decodedImage, err := base64.StdEncoding.DecodeString(imgBase64)
	if err != nil {
		return fmt.Errorf("DecodeString: %v", err)
	}

ちなみにStdEncodingRawStdEncodingの違いは、
base64文字列に「=」(padding)を含むか含まないか、みたいです
参考) 技術向上

あとは公式通りにやればできました。
【google公式】オブジェクトのアップロード

補足

multipart/form-data

ちなみにmultipart/form-data形式で送る際は、

ファイルを送信する場合、requestsのヘッダーに「multipart/form-data」を設定する必要があるため、JSONをJSONとして送れない

参考)【Python】RequestsでJSONデータと画像ファイルのPOST送信と取得

みたいです。こちらの記事にあるようにjsonっぽく受け取る方法もあるみたいです。

本記事を通して間違っているところがございましたらご指摘いただければと思います!:bow:

参考サイト

本記事作成にあたって他に以下のサイトを参考にさせていただきました
【google公式】オブジェクトのアップロード

GAE/GOからmultipart/form-dataでGCSに画像をアップロードする

いろいろ備忘録日記

Go言語(golang)でGoogle Cloud Storageへファイルをアップロードする

GolangでGoogle Cloud Storageに画像やファイルをアップロードする(os.Setenvで環境変数GOOGLE APPLICATION CREDENTIALSを設定する)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?