我正在尝试创建用于图片上传和下载的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"}
答案 0 :(得分:0)
如果您为每个用户建立了某个结构和常规路径,那么您只需要在每个路径的末尾附加文件名(在每个用户的同一文件夹内),并且每个用户都有很多图像用户。
在我的项目中,我在arc生成的Elixir文件中执行了此操作,在以下函数中:
def storage_dir(_, {_file, scope}) do
"/uploads/tickets/attachments/#{scope.id}"
end
您不应该直接将图像插入用户模型。如果您想要按用户存储图像,我建议您执行user_images表,对于每个图像,您可以存储用户的ID和图像URL(以及您可能需要的其他字段)。