elixir – 本地存储中图像的弧URL

我正在使用
arc
arc_ecto上传用户模型的头像.在开发过程中,我想使用本地存储.上传有效,但我不知道如何实际显示图像.

我可以显示文件名但是没有获取本地存储的URL以在< img>中使用它.标签.我是否必须在配置中使用不同的目录或以不同的方式在视图中访问它?

网页/模板/用户/ show.html.eex

<h2>Show user</h2>

[...]

<%= MyApp.Avatar.url({@user.avatar, @user}, :original) %>

网站/上传/ avatar.ex

defmodule MyApp.Avatar do
  use Arc.Definition
  use Arc.Ecto.Definition

  @versions [:original, :thumb]

  def transform(:thumb, _) do
    {:convert, "-strip -thumbnail 100x100^ -gravity center -extent 100x100"}
  end

  def __storage, do: Arc.Storage.Local

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

  # Override the storage directory:
  def storage_dir(version, {file, scope}) do
    "web/static/assets/images/avatars/#{scope.id}"
  end
end

最佳答案 像图片这样的静态资产是在priv / static /下运行的.我在我的应用程序中使用特殊帮助函数进行弧上传.

这是代码:

# helper
defmodule MyApp.AssetHelper do
  def upload_path(path) do
    case is_binary(path) do
      true ->
        path
        |> String.replace("priv/static/", "/")
      _ ->
        nil
    end
  end
end

# web/web.ex
  def view do
    quote do
      ....
      import MyApp.AssetHelper, only: [upload_path: 1]
      ....
      import MyApp.Router.Helpers
      import MyApp.ErrorHelpers
      import MyApp.Gettext
    end
  end

# view
defmodule MyApp.AvatarView do
  use MyApp.Web, :view

  def avatar_path(avatar) do
    MyApp.Avatar.url({avatar.image, avatar}, :thumb)
    |> upload_path
  end
end

然后你可以在模板中使用它作为普通的视图功能

点赞