MoTLab -GO Inc. Engineering Blog-MoTLab -GO Inc. Engineering Blog-

GraphQLでファイルアップロード

October 27, 2021

ソフトウェア開発部バックエンドグループの大木です。

2021年10月にリリースした法人向けサービス GO BUSINESS ではフロント・BFF間にGraphQL、BFF・サーバ間にgRPCを利用しています。

それぞれのファイルアップロード方法について、2回に分けて書いていきます。

Upload 型を定義する

GraphQLには multipart/form-data 形式でのファイルアップロード用に Upload 型がビルトインで用意されています。これを使うためには、スキーマに Upload 型を記載する必要があります。

type Mutation {
	uploadBusinessidsCsv(input: UploadBusinessidsCsvMutationInput!): UploadBusinessidsCsvMutationPayload!
}

scalar Upload 

"""
CSVアップロードリクエスト
"""
input UploadCSVMutationInput {
  "アップロードするCSVデータ"
  csvData: Upload! # Uploadはnon-nullableにしかできないようで、nullable(Upload)では動作しませんでした
  "アップロードの種別"
  uploadType: FileUploadType!
}

"""
CSVアップロードレスポンス
"""
type UploadCSVMutationPayload {
  "アップロード結果"
  uploadOperation: UploadResult!
}


"""
ファイルアップロードの種別
"""
enum FileUploadType {
  "ユーザー作成"
  CREATE
  "ユーザー更新"
  UPDATE
}

"""
ファイルアップロードの結果
"""
enum FileUploadType {
  "成功"
  SUCCESS
  "失敗"
  FAILED
}

curl localhost:4000/graphql \
  -F operations='{ "query": "mutation ($file: Upload!) { singleUpload(file: $file) }", "variables": { "file": null } }' \
  -F map='{ "0": ["variables.file"] }' \
  -F 0=@a.txt