本地存储中图像的弧URL

时间:2016-04-29 12:39:20

标签: elixir phoenix-framework

我使用arcarc_ecto上传user模型的头像。在开发过程中,我想使用本地存储。上传有效,但我不知道如何实际显示图片。

我可以显示文件名,但不能获取本地存储的网址,以便在<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

1 个答案:

答案 0 :(得分:2)

图片等静态资源在priv/static/下有效。我在我的应用中使用arc上传的特殊助手功能。 这是代码:

# 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

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