如何使用 Plug.Upload?

sal*_*ane 6 elixir

我想Plug.Upload在我的一个路由器中使用,上面没有任何库或框架,但这里的官方文档:https : //hexdocs.pm/plug/Plug.Upload.html没有提供与其他插件不同的示例,例如:Plug.Parsershttps://hexdocs.pm/plug/Plug.Parsers.html)。

有人可以举个例子吗?

Rom*_*iko 6

Plug.Upload不是插头,正如 Aleksei 在评论中提到的那样。您无法将其添加到您的管道中。相反,:multipart应该允许在Plug.Parsers您的配置中endpoint.ex(默认情况下在那里):

plug Plug.Parsers,
  parsers: [:urlencoded, :multipart, :json],
  pass: ["*/*"],
  json_decoder: Phoenix.json_library()
Run Code Online (Sandbox Code Playgroud)

您需要一个路由来处理带有上传文件的 POST 请求:

post "/upload_photo", UploadController, :photo
Run Code Online (Sandbox Code Playgroud)

相应的控制器操作将Plug.Upload在其参数之一中获得一个结构体:

def photo(conn, %{"upload" => upload}) do
  IO.inspect upload.photo, label: "Photo upload information"
  # TODO: you can copy the uploaded file now,
  #       because it gets deleted after this request
  json(conn, "Uploaded #{upload.photo.filename} to a temporary directory")
end
Run Code Online (Sandbox Code Playgroud)

为了进行测试,您可以添加一个具有表单的页面 multipart: true

<%= form_for @conn, "/upload_photo", [as: :upload, multipart: true], fn f -> %>
Run Code Online (Sandbox Code Playgroud)

它有一个文件输入

<%= file_input f, :photo, class: "form-control" %>
Run Code Online (Sandbox Code Playgroud)

Phoenix 框架文档中提供了详细说明。

  • 这是我最终所做的: 1. 注册解析器插件: `plug Plug.Parsers, parsers: [:urlencoded, :multipart], pass: ["*/*"]` 2. 上传的文件可在下访问: `conn.body_params["image"]` 其中 `image` 是请求中文件的键 (3认同)