Ho due controller product
nel mio back-end elisir/phoenix. In primo luogo - API endpoint (pipe_through :api
) e secondo controller piping through :browser
:Allegati di file per redux-form ed elisir/phoenix come API di backend (problema di serializzazione)
# 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
gestisce le richieste provenienti forma generate da helper delle form elisir e accetta un certo file allegati. Va tutto bene. Qui è creare l'azione e params elaborati da questa azione:
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
params da log (sto usando arc per la movimentazione di caricamento delle immagini nel codice elisir)
[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
gestisce le richieste provenienti da redux-from. Ecco l'azione, vista e params, che vengono elaborati da questa azione:
# 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
creano l'azione non riesce con 422 lo stato, perché l'immagine non può essere salvata con queste params. Il mio problema è che non riesco ad accedere all'immagine dal codice back-end, l'ho solo nel mio codice JS come oggetto FileList. Non capisco come passare l'immagine al codice back-end. Ecco come questo allegato è rappresentato nel mio codice JS (FileList, contenente informazioni sull'immagine caricata).
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: ""
ho solo WebkitRelativePath (In caso di primo controller devo percorso dell'immagine: "/ tmp/plug-1460/multipart-754282-298907-1") e non so che cosa posso fare con questo oggetto JS e come accedere all'immagine reale rappresentata da questo oggetto JS (ecco uno redux-form reference sui caricamenti di file).
Potrebbe aiutarmi? Come spiegare ad elisir come trovare un'immagine? Vorrei solo inviare file allegati al mio backend usando il codice JS (perché ci sono molte caratteristiche interessanti per la validazione asincrona, ecc.).
Ecco un link ad una completa app se potesse essere utile
Le risorse statiche come le immagini devono essere visualizzate in 'priv/static /'. Riesci a trovare il file in 'priv/static/tmp/plug-1460/multipart-754282-298907-1'? In caso contrario, prova a memorizzare l'immagine lì. – tkowal
Il mio problema è che non riesco ad accedere all'immagine dal codice back-end, l'ho solo nel mio codice JS come oggetto FileList. Non capisco come passare l'immagine al codice back-end. Non c'è niente in priv/static/tmp comunque –