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