重新转换现有的头像

时间:2017-05-12 11:07:47

标签: elixir phoenix-framework

我使用Arc将头像图片附加到用户模型:

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

  schema "users" do
    field :first_name, :string
    field :last_name, :string
    field :avatar, Abc.Avatar.Type
    [...]

我转换了我要为现有用户更改的头像缩略图。我改变了转换规则,需要重新转换它们。

如何重新转换给定用户的头像?

1 个答案:

答案 0 :(得分:1)

快速执行此操作的方法是将原始图像作为Abc.Avatar的附件版本之一,并在进行更改时使用arc_ecto' s cast_attachments重新上传该图像重新转换其他版本。

avatar.ex中,您将拥有:original版本而不进行转换。

defmodule Abc.Avatar do
  use Arc.Definition
  use Arc.Ecto.Definition
  @versions [:original, :thumb]
  ...
  # You specify transformations for :thumb but not for :original
  def transform(:thumb, _) do
    # Your transformation
  end
  ...
end

然后在user.ex中定义changeset以上传头像。如果您使用s3,则需要将allow_paths: true发送到cast_attachments,以便您可以通过发送网址上传图片。

def update_avatar(user, params) do
  user
  |> cast_attachments(params, [:avatar], allow_paths: true)
end

最后在某个地方定义一个获取原始头像url(或本地路径)并将其传递给update_avatar并更新数据库的方法(可以在同一个用户模块或一些额外的帮助模块中)。

def retransform_avatar(user) do
  url = Abc.Avatar.url({user.avatar, user}, :original)

  Abc.User.update_avatar(user, %{avatar: url}) |> Abc.Repo.update()
end

如果您想立即重新处理所有图像,可以执行以下操作:

Abc.Repo.all(Abc.User) |> Enum.each(fn u -> retransform_avatar(u) end)