2016-07-20 13 views
0

Ich verwende Elixiere Arc mit Ecto und Amazon S3 zum Speichern von Dateien, die ich zuvor heruntergeladen habe. Alles scheint zu funktionieren, sie enden auf S3. Aber nichts ist in meiner Datenbank gespeichert. Wenn ich also versuche, eine URL zu generieren, bekomme ich immer nur die Standard-URL zurück. DieseElixir Arc: Datei wird hochgeladen und verarbeitet, aber nicht in der Datenbank gespeichert

ist, wie ich speichern Sie eine Datei:

iex > user = Repo.get(User, 3) 
iex > Avatar.store({"/tmp/my_file.png", user}) 
{:ok, "my_file.png"} 

Aber das user.avatar Feld ist immer noch gleich Null.

Mein Benutzermodul:

defmodule MyApp.User do 
    use MyApp.Web, :model 
    use Arc.Ecto.Schema 

    alias MyApp.Repo 

    schema "users" do 
    field :name, :string 
    field :email, :string 
    field :avatar, MyApp.Avatar.Type  
    embeds_many :billing_emails, MyApp.BillingEmail 
    embeds_many :addresses, MyApp.Address 
    timestamps 
    end 

    @required_fields ~w(name email) 
    @optional_fields ~w(avatar) 

    def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    |> cast_embed(:billing_emails) 
    |> cast_embed(:addresses) 
    |> validate_required([:name, :email]) 
    |> validate_format(:email, ~r/@/) 
    |> unique_constraint(:email) 
    |> cast_attachments(params, [:avatar]) 
    end 

end 

Der Avatar Uploader:

defmodule MyApp.Avatar do 
    use Arc.Definition 

    # Include ecto support (requires package arc_ecto installed): 
    use Arc.Ecto.Definition 

    @acl :public_read 

    # To add a thumbnail version: 
    @versions [:original, :thumb] 

    # Whitelist file extensions: 
    def validate({file, _}) do 
    ~w(.jpg .jpeg .gif .png) |> Enum.member?(Path.extname(file.file_name)) 
    end 

    # Define a thumbnail transformation: 
    def transform(:thumb, _) do 
    {:convert, "-strip -thumbnail 250x250^ -gravity center -extent 250x250 -format png", :png} 
    end 

    def transform(:original, _) do 
    {:convert, "-format png", :png} 
    end 

    def filename(version, {file, scope}), do: "#{version}-#{file.file_name}" 

    # Override the storage directory: 
    def storage_dir(version, {file, scope}) do 
    "uploads/user/avatars/#{scope.id}" 
    end 

    # Provide a default URL if there hasn't been a file uploaded 
    def default_url(version, scope) do 
    "/images/avatars/default_#{version}.png" 
    end 

end 

Antwort

2

Also die Antwort auf diese ist eine doppelte. Zuerst musste ich avatar von meinem optional_fields in meinem Benutzermodul entfernen.

@optional_fields ~w() 

Zweitens Sie Avatar.store nicht direkt aufrufen, sondern eine changeset verwenden.

avatar_params = %{avatar: "/tmp/my_file.jpg"} 
user = Repo.get(User, 1) 
avatar_changeset = User.changeset(user, avatar_params) 
Repo.update(avatar_changeset) 

Edit: In einer Elixir Art und Weise:

avatar_params = %{avatar: "/tmp/my_file.jpg"} 
Repo.get(User, 1) |> User.changeset(avatar_params) |> Repo.update()