image_plug_parser v1.0.0 ImagePlugParser

Parses image in PUT request body.

Usage

Image parser must be used only in controller

defmodule Server.Web.FilesController do
  use Server.Web, :controller

  plug Plug.Parsers,
    parsers: [ImagePlugParser],
    subtypes: ["jpeg", "png"]

  def upload(conn, %{"file" => %{filename: filename, path: path, content_type: mimetype}}) do
    path
    |> FilesManager.upload(filename, mimetype)
    |> response(conn)
  end
end

and router must set wildcard path with name filename

defmodule Server.Web.Router do
  use Server.Web, :router

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/api", Server.Web do
    pipe_through :api

    put "/files/:page_id/*filename", FilesController, :upload
  end
end

Options

  • :subtypes - list of supported image content types, eg. jpeg or png

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.

Link to this section Summary

Functions

Callback implementation for Plug.Parsers.init/1

Attempts to parse the connection’s request body given the content-type type, subtype, and its parameters

Link to this section Functions

Callback implementation for Plug.Parsers.init/1.

Link to this function parse(conn, arg2, subtype, headers, arg5)

Attempts to parse the connection’s request body given the content-type type, subtype, and its parameters.

The arguments are:

  • the Plug.Conn connection
  • type, the content-type type (e.g., "x-sample" for the "x-sample/json" content-type)
  • subtype, the content-type subtype (e.g., "json" for the "x-sample/json" content-type)
  • params, the content-type parameters (e.g., %{"foo" => "bar"} for the "text/plain; foo=bar" content-type)

This function should return:

  • {:ok, body_params, conn} if the parser is able to handle the given content-type; body_params should be a map
  • {:next, conn} if the next parser should be invoked
  • {:error, :too_large, conn} if the request goes over the given limit

Callback implementation for Plug.Parsers.parse/5.