Hey there,
Hope you’ll doing amazingly. I am building an app using liveview in pheonix. But the problem I’m facing right now is that when I’m uploading various files through one input field, its storing only one image from multiple uploaded images. It took my 3 days in applying various techniques but till yet I have not reached any point.
Now, I think my rest of code is working fine I need to make a query for my images i.e. Repo.insert(). But still not sure why its not saving all of them and where’s the real bug?
Here’s the code:
form_component.ex:
defp save_files(socket, :new, file_params) do
file = put_file_url(socket, file_params)
case Files.create_files(file, &consume_files(socket, &1)) do
{:ok, _file} →
{:noreply,
socket
|> put_flash(:success, “File created successfully”)
|> push_redirect(to: socket.assigns.return_to)}
{:error, %Ecto.Changeset{} = changeset} →
{:noreply, assign(socket, changeset: changeset)}
end
end
def ext(entry) do
[ext | _] = MIME.extensions(entry.client_type)
ext
end
defp put_file_url(socket, file) do
{completed, []} = uploaded_entries(socket, :uploaded_file)
Get File Details
[fd | _] =
for entry <- completed do
entry
end
url = Routes.static_path(socket, "/uploads/#{fd.uuid}.#{ext(fd)}")
name = fd.client_name
size = fd.client_size
type = fd.client_type
# Set File data
file = %{file | "url" => url, "name" => name, "size" => size, "type" => type}
end
def consume_files(socket, files) do
case uploaded_entries(socket, :uploaded_file) do
{[_ | _] = entries, []} →
uploaded_file =
for entry ← entries do
consume_uploaded_entry(socket, entry, fn %{path: path} →
# dest = Path.join(“priv/static/uploads”, path.basename(path))
dest =
Path.join([
:code.priv_dir(:initium),
“static”,
“/uploads/#{entry.uuid}.#{ext(entry)}”
])
File.cp!(path, dest)
Routes.static_path(socket, “/uploads/#{Path.basename(dest)}”)
end)
# {:noreply, update(socket, :entry, &(&1 ++ entry))}
end
{:noeply, update(socket, :uploaded_files, &(&1 ++ uploaded_file))}
_ →
{:noreply, socket}
end
{:ok, files}
end
file.ex:
def create_files(attrs \ %{}, after_save \ &{:ok, &1}) do
%File{}
|> after_save(after_save)
|> File.changeset(attrs)
|> Repo.insert()
end
defp after_save({:ok, file}, func) do
{:ok, _file} = func.(file)
end
defp after_save(error, _func) do
error
end