GraphSQL:ファイル、アップロードもっとファイル!


この記事は私の' GraphQL '記事シリーズの一部であるので、あなたが「現実のプロジェクトで3年長いGraphics冒険」に興味を持っている場合にだけでなく他のものをチェックアウトするのも自由である.
さて、何が最も必要と広い使用Web機能の一つですか?確かにファイルアップロードです.
PFF、何が大騒ぎ、あなたは考えるかもしれません.標準multipart/form-data , FILES アレイFileInputStream |などを行います.すべての種類の言語、フレームワークまたはベンダーの様々な実装.この瞬間に、あなたはおそらく考えています、そして、何がGraphqlで間違っているか、なぜ我々は通常通りそれを実装することができますか?することができます!そして何もそれを標準的な方法からあなたを停止します.まあ、待って、1つの事を除いて.PHPファイル配列(または他のバックエンド言語ソリューション)からファイルをアップロードする場合、クエリハンドラー(Resolver)は、アップロードされたファイルについて文字通り何も知りません.それは単にファイルのないクエリです.通常、アプリケーション層で処理します.ファイル構造を取得し、それを操作します.私たちは、このタイプのGraphSQLプロジェクトでの私の最初のDDDのアップロードを持っています.層のロジックをミックスするには、常に任意のプロジェクトアーキテクチャでは悪い決断です.それは良いことではありませんでした、そして、私は常にそれを変えたいです、そして、ゼロからどんなプロジェクトででも、私は正しいことをします.そして、現在のプロジェクトでは、私と仲間のチームメイトによって首尾よく実行されました.
Graphicの愛好家と開発者は準備ができて、あなたのための解決策を持っています.アップロードされたファイルのカスタムタイプEcodev 開発者
引数を指定し、より具体的には、このタイプのファイルを読み込むためのパラメータの1つはとても簡単に見えます.
FileUploaderResolver:

'args' => [ 'file' => new UploadType()]
Fileeupload変異例:
mutation(
   $file: Upload
) {
   uploadYourFileHere(
       file: $file
   ) {
      File {
          path,        
          name
      }
}
さらに言うと、レゾルバを作成し、このオブジェクトの型を使用した後、このファイルを使用した追加のアプリケーションロジックアクションは、標準のファイルのアップロードと同じです.フロントエンド開発者はファイルをダウンロードしてmap スキーマ.
例えば、リクエストペイロード
--------------------------cec8e8123c05ba25
Content-Disposition: form-data; name="operations"

{ "query": "mutation ($file: Upload!) { uploadYourFileHere(file: $file) { id } }", "variables": { "file": null } }
--------------------------cec8e8123c05ba25
Content-Disposition: form-data; name="map"

{ "0": ["variables.file"] }
--------------------------cec8e8123c05ba25
Content-Disposition: form-data; name="0"; filename="a.txt"
Content-Type: text/plain
Alpha file content.

--------------------------cec8e8123c05ba25--
とファイルのリスト(差分は、ここで' map 'だけで、突然変異paramとしてリストをアップロードします).
Content-Disposition: form-data; name="map"

{ "0": ["variables.files.0"], "1": ["variables.files.1"] }
すべての詳細を探索することができますGraphQl Multipart Request documentation またはtests である.
アップロード後、任意の好ましい方法でファイルを格納することができます.クラウドが熟しているので、DBでのリンクでAWS S 3にそれらを保存するのが好きです.
あなたのコードを清潔に保ち、自分自身を安全で健全にしなさい.