我使用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
[...]
我转换了我要为现有用户更改的头像缩略图。我改变了转换规则,需要重新转换它们。
如何重新转换给定用户的头像?
答案 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)