Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Storing a file without Plug.Upload #11

Closed
darksheik opened this issue Dec 9, 2015 · 10 comments
Closed

Storing a file without Plug.Upload #11

darksheik opened this issue Dec 9, 2015 · 10 comments

Comments

@darksheik
Copy link

Your example passes a Plug.Upload parameter to store the file in the database.
Can you provide an example of an update that just uploads a file from your hard drive?

I want to be able to do something like this:

    model_record = Repo.get!(MyTable, 1)

    {:ok, filename} = MyProject.Attachment.store({path, model_record})
    Repo.update!(%{model_record | attachment: filename})

The file is successfully stored on S3, but I am not sure what the changeset is expecting me to pass.

@darksheik
Copy link
Author

I figured out something that works, but not sure if it is correct.

Repo.update!(%{model_record | attachment: %{file_name: filename, updated_at: Ecto.DateTime.utc}})

@mrkaspa
Copy link

mrkaspa commented Jan 1, 2016

I need the same thing, I tried to fake the plug upload, but didn't work

 params = %{
      avatar: %Plug.Upload{
        content_type: "image/jpeg",
        filename: "#{user.id}.jpeg",
        path: file_url
      }
    }
changeset = User.update_changeset(user, params)
response = Repo.update(changeset)

#THE CHANGESET METHOD
def update_changeset(model, params \\ :empty) do
    |> cast(params, @required_fields, @optional_fields)
    |> cast_attachments(params, @required_file_fields, @optional_file_fields)
end

@mrkaspa
Copy link

mrkaspa commented Jan 1, 2016

@darksheik so you had to upload the file manually and after that update the record on the database?

@stavro
Copy link
Owner

stavro commented Jan 1, 2016

Hi Michel! You don't need a Plug.Upload! Just create a regular Elixir map
with the filename and path and it should work just fine.
On Dec 31, 2015 7:10 PM, "Michel Perez" notifications@github.com wrote:

@darksheik https://github.com/darksheik so you had to upload the file
manually and after that update the record on the database?


Reply to this email directly or view it on GitHub
#11 (comment).

@mrkaspa
Copy link

mrkaspa commented Jan 2, 2016

@stavro I tried but doesn't work I'm testing with the lastest elixir version

@stavro
Copy link
Owner

stavro commented Jan 3, 2016

Ok - I will be back in town on Tuesday and help resolve. Apologies for the
confusion!
On Jan 1, 2016 10:30 PM, "Michel Perez" notifications@github.com wrote:

@stavro https://github.com/stavro I tried but doesn't work I'm testing
with the lastest elixir version


Reply to this email directly or view it on GitHub
#11 (comment).

@darksheik
Copy link
Author

Sorry I missed this activity!
Yes, uploading to S3 manually. With my model set up to store the file on S3 in the "attachment" field (see the https://github.com/stavro/arc repo):

field :attachment, MyApp.Attachment.Type

I did this:

   {:ok, s3_filename} = MyApp.Attachment.store({local_filename, record})  # Upload to S3
   Repo.update!(%{record |
      attachment: %{file_name: s3_filename, updated_at: Ecto.DateTime.utc}}
    )

@mrkaspa
Copy link

mrkaspa commented Jan 4, 2016

@darksheik that worked for me but I don't think it be the best solution

@darksheik
Copy link
Author

I agree - should just be able to do it in one go.

@stavro
Copy link
Owner

stavro commented Jan 21, 2016

An example from the local harddrive:

params = %{"avatar" => "/Users/sean/Downloads/picture.png"}

User
  |> Repo.get!(1)
  |> User.update_avatar(params)
  |> SchedWeb.Repo.update!

# models/user.ex

def update_avatar(user, params) do
  user
    |> cast_attachments(params, ~w(), ~w(avatar))
end

@stavro stavro closed this as completed Jan 21, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants