Plug.Parsers.MULTIPART (Plug v1.12.1) View Source
Parses multipart request body.
Options
All options supported by Plug.Conn.read_body/2
are also supported here.
They are repeated here for convenience:
:length
- sets the maximum number of bytes to read from the request, defaults to 8_000_000 bytes:read_length
- sets the amount of bytes to read at one time from the underlying socket to fill the chunk, defaults to 1_000_000 bytes:read_timeout
- sets the timeout for each socket read, defaults to 15_000ms
So by default, Plug.Parsers
will read 1_000_000 bytes at a time from the
socket with an overall limit of 8_000_000 bytes.
Besides the options supported by Plug.Conn.read_body/2
, the multipart parser
also checks for:
:headers
- containing the same:length
,:read_length
and:read_timeout
options which are used explicitly for parsing multipart headers:include_unnamed_parts_at
- string specifying a body parameter that can hold a lists of body parts that didn't have a 'Content-Disposition' header. For instance,include_unnamed_parts_at: "_parts"
would result in a body parameter"_parts"
, containing a list of parts, each with:body
and:headers
fields, like[%{body: "{}", headers: [{"content-type", "application/json"}]}]
:validate_utf8
- specifies whether multipart body parts should be validated as utf8 binaries. Defaults to true
Dynamic configuration
If you need to dynamically configure how Plug.Parsers.MULTIPART
behave,
for example, based on the connection or another system parameter, one option
is to create your own parser that wraps it:
defmodule MyMultipart do
@multipart Plug.Parsers.MULTIPART
def init(opts) do
opts
end
def parse(conn, "multipart", subtype, headers, opts) do
limit = [limit: System.fetch_env!("UPLOAD_LIMIT")]
opts = @multipart.init([limit: limit] ++ opts)
@multipart.parse(conn, "multipart", subtype, headers, opts)
end
def parse(conn, _type, _subtype, _headers, _opts) do
{:next, conn}
end
end