使用Arc和Arc.Ecto

时间:2016-02-25 15:00:53

标签: elixir phoenix-framework

我正在尝试创建用于图片上传和下载的API。我使用Arc进行图像上传(本地存储),使用Arc.Ecto将上传的图像附加到用户模型。 API允许用户上传多个图像。当我上传不同的图像时,Arc会成功地将每个图像保存为用户。

我的问题是,如何上传多个图像并将这些图像参考存储在数据库中。目前,Arc不断替换相同的图像参考。

  schema "users" do
    field :name, :string
    field :age, :integer
    field :gender, :string
    field :user_name, :string
    field :email, :string
    field :crypted_password, :string
    field :password, :string, virtual: true
    field :avatar, LoginService.Avatar.Type
    timestamps
  end

我尝试在用户模型中使用 MyApp.Avatar.Type 类型创建多个字段来存储图片,但我无法找到连接我可以告诉arc存储特定用户字段上的给定图像。 例如,我想保存第一张图片以防止" avatar"在用户模型中的字段,然后将第二个图像保存为" image_1"针对相同用户模型的字段。

我在控制器上的上传方法:

def upload(conn, user_params) do
  case get_user(conn) do
     {:ok, scope}  ->
                     changeset = User.changeset(scope, user_params)
                     case Repo.update(changeset) do
                         {:ok, scope} ->  case Avatar.store({user_params["avatar"],scope}) do
                                                   {:ok, file} ->
                                                     send_resp(conn, :no_content, "")
                                                   {:error, error} -> send_resp(conn, 500, "")
                                                 end
                       {:error, changeset} ->  send_resp(conn, :unprocessable_entity, changeset)
                   end
      {:ok, reasons} -> conn |> json(%{error: "failed to save image", reasons: reasons})
              end
  end

因此,当我在上述方法中说Avatar.store({user_params [" avatar"],scope})时,Arc会将图像存储在本地目录中,并将图像名称加上版本保存在头像中用户模型中的字段。

并且请求是:

POST localhost:4000///api/documents

身体:{"avatar": "/Users/xyz/Documents/abc/wed-7.jpg"}

1 个答案:

答案 0 :(得分:0)

如果您为每个用户建立了某个结构和常规路径,那么您只需要在每个路径的末尾附加文件名(在每个用户的同一文件夹内),并且每个用户都有很多图像用户。

在我的项目中,我在arc生成的Elixir文件中执行了此操作,在以下函数中:

  def storage_dir(_, {_file, scope}) do
    "/uploads/tickets/attachments/#{scope.id}"
  end

您不应该直接将图像插入用户模型。如果您想要按用户存储图像,我建议您执行user_images表,对于每个图像,您可以存储用户的ID和图像URL(以及您可能需要的其他字段)。