2

私は Elixir/Phoenix json API バックエンドを書いていますが、エンドポイントが複数の画像ファイルと json 形式の属性を 1 つのリクエストで受け取るようにしたいと考えています。そのためにコンテンツ タイプを使用してmultipart/mixedいます。cURL リクエストは次のようになります。

curl -4 -H "Content-Type: multipart/mixed" \
  -H "Authorization: FNRM8ISXiUujh+I2X" \
  -F "meta={"registration": "face"}; type=application/json" \
  -F "captures[]=@r1.jpg; type=image/jpg" \
  -F "captures[]=@r2.jpg; type=image/jpg" \
  -X POST http://localhost:4000/api/bioid/register -i -v

コントローラーのアクションでは、適切に解析されたファイルを受け取りますが、json 部分は解析されないままです。

pry(2)> params
%{
  "captures" => [
    %Plug.Upload{
      content_type: "image/jpg",
      filename: "r1.jpg",
      path: "/var/folders/v7/qlf90zb13szch162hvx6d1s00000gn/T//plug-1530/multipart-1530206341-21611204340048-7"
    },
    %Plug.Upload{
      content_type: "image/jpg",
      filename: "r2.jpg",
      path: "/var/folders/v7/qlf90zb13szch162hvx6d1s00000gn/T//plug-1530/multipart-1530206341-700143184604965-7"
    }
  ],
  "meta" => "{registration: face}; type=application/json"
}

関連すると思われるディスカッション、WIP: How to parse multipart form with JSON field #570 があります。パーツの解析がapplication/json自動的に行われることを期待すべきではないことは明らかです。代わりに、最後のメッセージは、カスタム本文リーダーを使用して追加の解析を実行することを提案しています。

この解釈は正しいですか、それともmultipart/mixedペイロードを処理する別の方法があり、application/jsonパーツから生成されたすべてのパラメーターが既に解析されたコントローラー アクションで使用できるようになりますか?


副次的な質問

私を混乱させるのは、上記の解析が行われることです。使用する必要さえありませんPlug.Parsers。私が読んだことから、解析されたマルチパートペイロードを取得するには、次のことが必要になるはずです。

plug Plug.Parsers,
  parsers: [:urlencoded, :multipart, :json],
  json_decoder: Poison

このプラグがパイプラインに存在するかどうかに関係なく、同じ結果が得られます。おそらくデフォルトでそこにありますが、確認したいと思います。

Elixir 1.6.5、Phoenix 1.3.2、Plug 1.6.0 を使用しています。

4

1 に答える 1