Go + gRPC でメタ情報も送れるファイルアップローダーを書いた
今回は Go + gRPC でファイルアップローダーを書いたので紹介します。しかも、ファイルのアップロードだけではなくメタデータも同時に送れるように作成しました。
イメージ
今回作成するにあたって、次のようなイメージで作成しました。
- 前提は stream 通信(ファイルのアップロードに必要不可欠)
- クライアントから送信したいファイルのメタ情報を送る
- ファイルデータを少しずつ送信
- 結果を受け取る
アップロード周りの protobuf
これを実現するために oneof を用いました。
理由としては次の通りです。
If you have a message with many fields and where at most one field will be set at the same time, you can enforce this behavior and save memory by using the oneof feature.
要するに最大で一つのフィールドを扱うのでメモリを節約することができる利点があるのです。(C 言語でいう union のような機能)
定義は次の通りです。
service FileUploader { rpc Upload(stream FileRequestType) returns (ResultResponseType) {}; } message ChunkType { bytes data = 1; } message FileHeaderType { string name = 1; int64 size = 2; message MIMEHeaderType { string key = 1; repeated string values = 2; } repeated MIMEHeaderType header = 3; } message FileRequestType { oneof File { ChunkType chunk = 1; FileHeaderType header = 2; } }
ChunkType
にはbytes
の型のフィールドを持たせています。これはファイルのアップロードのために利用されますFileHeaderType
にはファイルのメタ情報が含まれます。今回持たせているメタ情報は以下の通りです
所感
- http リクエストと同じようにファイルアップロードする際にメタ情報を同時に送れるので gRPC でファイルアップローダーを作ろうと思えば作れることも分かった
multipart/form-data
としての振る舞いも行うことができそう
ソースコードを公開してるので良かったらどうぞ