我的 elixir/phoenix 后端有两个product
控制器。第一个 - API 端点(pipe_through :api
)和第二个控制器piping through :browser
:
# router.ex
scope "/api", SecretApp.Api, as: :api do
pipe_through :api
resources "products", ProductController, only: [:create, :index]
end
scope "/", SecretApp do
pipe_through :browser # Use the default browser stack
resources "products", ProductController, only: [:new, :create, :index]
end
ProductController
处理由 elixir 表单助手生成的表单请求并接受一些文件附件。一切都很好。以下是此操作处理的创建操作和参数:
def create(conn, %{"product" => product_params}) do
changeset = Product.changeset(%Product{}, product_params)
case Repo.insert(changeset) do
{:ok, _product} ->
conn
|> put_flash(:info, "Product created successfully.")
|> redirect(to: product_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
日志中的参数(我正在使用arc处理长生不老药代码中的图像上传)
[debug] Processing by SecretApp.ProductController.create/2
Parameters: %{"_csrf_token" => "Zl81JgdhIQ8GG2c+ei0WCQ9hTjI+AAAA0fwto+HMdQ7S7OCsLQ9Trg==", "_utf8" => "✓",
"product" => %{"description" => "description_name",
"image" => %Plug.Upload{content_type: "image/png",
filename: "wallpaper-466648.png",
path: "/tmp/plug-1460/multipart-754282-298907-1"},
"name" => "product_name", "price" => "100"}}
Pipelines: [:browser]
Api.ProductController
处理来自redux-from 的请求。这里是action、view和params,由这个action处理:
# action in controller
def create(conn, %{"product" => product_params}) do
changeset = Product.changeset(%Product{}, product_params)
case Repo.insert(changeset) do
{:ok, _product} ->
conn
|> render("index.json", status: :ok)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", changeset: changeset)
end
end
# product_view.ex
def render("index.json", resp=%{status: status}) do
%{status: status}
end
def render("error.json", %{changeset: changeset}) do
errors = Enum.into(changeset.errors, %{})
%{
errors: errors
}
end
[info] POST /api/products/
[debug] Processing by SecretApp.Api.ProductController.create/2
Parameters: %{"product" => %{"description" => "product_description", "image" => "wallpaper-466648.png", "name" => "product_name", "price" => "100"}}
Pipelines: [:api]
[info] Sent 422 in 167ms
创建操作失败,状态为 422,因为无法使用这些参数保存图像。我的问题是我无法从后端代码访问图像,我只在我的 JS 代码中将它作为 FileList 对象。我不明白如何将图像传递给后端代码。这是这个附件在我的 JS 代码中的表示方式(FileList,包含有关上传图像的信息)。
value:FileList
0: File
lastModified: 1381593256801
lastModifiedDate: Sat Oct 12 2013 18:54:16 GMT+0300
name: "wallpaper-466648.png"
size: 1787293
type: "image/png"
webkitRelativePath: ""
我只有 WebkitRelativePath(如果第一个控制器我有图像路径:“/tmp/plug-1460/multipart-754282-298907-1”),我不知道我可以用这个 JS 对象做什么以及如何访问由这个 JS 对象表示的真实图像(这里是关于文件上传的redux-form 参考)。
你可以帮帮我吗?如何向elixir解释如何找到图像?我只想使用 JS 代码将文件附件提交到我的后端(因为异步验证等有很多有趣的功能)。
如果有帮助,这里是一个完整应用程序的链接