【问题标题】:Implementing a image gallery in Phoenix Framework (Elixir)在 Phoenix Framework (Elixir) 中实现图像库
【发布时间】:2016-03-11 23:04:05
【问题描述】:

我正在尝试使用 arc 实现图片库。 我面临以下问题

  1. 无法一次上传多个文件(到 AWS S3)
  2. 可以上传小于 mb 的文件,如果我尝试大文件会出现超时错误(想知道如何上传大文件)
  3. 显示来自 AWS S3 的图像

上传超过 MB 的文件时出现的错误是

[error] Task #PID<0.536.0> started from #PID<0.533.0> terminating
** (stop) {:aws_error, {:socket_error, :timeout}}
    (erlcloud) src/erlcloud_s3.erl:911: :erlcloud_s3.s3_request/8
    (erlcloud) src/erlcloud_s3.erl:611: :erlcloud_s3.put_object/6
    (arc) lib/arc/storage/s3.ex:9: Arc.Storage.S3.put/3
    (elixir) lib/task/supervised.ex:74: Task.Supervised.do_apply/2
    (elixir) lib/task/supervised.ex:19: Task.Supervised.async/3
    (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Function: #Function<2.64561725/0 in Arc.Actions.Store.async_put_version/3>
    Args: []
[error] Ranch protocol #PID<0.533.0> (:cowboy_protocol) of listener Pxblog.Endpoint.HTTP terminated
** (exit) an exception was raised:
    ** (ErlangError) erlang error: {:aws_error, {:socket_error, :timeout}}
        (erlcloud) src/erlcloud_s3.erl:911: :erlcloud_s3.s3_request/8
        (erlcloud) src/erlcloud_s3.erl:611: :erlcloud_s3.put_object/6
        (arc) lib/arc/storage/s3.ex:9: Arc.Storage.S3.put/3
        (elixir) lib/task/supervised.ex:74: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:19: Task.Supervised.async/3
        (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3

我正在关注arc upload

以下是控制器的创建函数

def create(conn, %{"post" => post_params, "images" => images_params}) do
    changeset = Post.changeset(%Post{}, post_params)

    case Repo.insert(changeset) do
      {:ok, _post} ->

        images = images_params

        current_user = %{id: 1}

        Enum.count(images, fn(image) -> Image.store({image, current_user}) end)

      conn
        |> put_flash(:info, "Post created successfully.")
        |> redirect(to: post_path(conn, :index))

      {:error, changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end

Arc 库提供了一个方法 MyApp.Avatar.url() 但是当我尝试在显示模板中调用它时,例如 MyApp.Avatar.url(@user.avatar , @user) 表示函数未定义。

【问题讨论】:

  • 首先将您目前掌握的有关这些问题的所有代码放入其中,然后人们将能够为您提供答案。

标签: elixir phoenix-framework


【解决方案1】:

不能一次上传多个文件(到 AWS S3)

正是出于这个原因,Elixir 具有并发便利模块!启动多个任务。示例:

images = []

images
|> Enum.map(fn(image) -> async_upload(image, current_user) end)
|> Enum.each(fn(task) -> Task.await(task, 60_000) end)

defp async_upload(image) do
  Task.async(fn ->
    Image.store({image, current_user})
  end)
end

可以上传小于1mb的文件,如果我尝试大文件会出现超时错误(想知道如何上传大文件)

Arc 中的超时现在是可配置的,可以提高。默认为 15 秒。

config :arc,
  version_timeout: 15_000 #milliseconds

显示来自 AWS S3 的图像

我不确定这里的问题是什么。但如果您觉得有问题,请在Arc 上打开一个问题。

免责声明:Arc的作者

【讨论】:

  • 谢谢,肖恩,此方法有效!关于显示我想知道的图像如何为用户检索图像?
【解决方案2】:

Arc 太新了,我认为你最好自己实现所有你需要的东西。向ImageMagick 或您用来转换图像的任何东西发送命令没有什么困难,然后您可以简单地使用ex_aws 包(或erlcloud,无论您更喜欢哪个)发送各种请求AWS S3 API 支持,实现这一点可能会比与arc 战斗花费更少的时间。

但是回到你的问题,我注意到有这样一行:

current_user = %{id: 1}

它只是一个地图,你可能需要使用用户的结构,所以它会是这样的:

current_user = Repo.get(User, 1)

除此之外,正如 rorra 所说,需要更多代码来查看可能出现的问题。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2017-04-19
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多