簡體   English   中英

使用Phoenix提供多個動態圖像時出現問題(有些負載,有些不負載)

[英]Problem serving multiple dynamic images with Phoenix (some load, some dont)

技術:Phoenix 1.4.9問題:使用“ img”標簽在網頁中提供已上傳的圖片,導致某些圖片可以加載而其他圖片則無法加載。

嘗試檢查圖像鏈接,但是每次都加載圖像鏈接(ae / image / 1或/ image / 2)時不會出現問題。

強制緩存清除也不能證明問題的任何跡象。

如果人們想自己玩代碼,這是git repo: https : //github.com/WannesFransen1994/phoenix-dynamic-images

我認為重要的代碼位:控制器:

def index(conn, _params) do
    images = Repo.all(Image)
    render(conn, "index.html", images: images)
  end

  def create(conn, %{"upload" => %Plug.Upload{} = up}) do
    {:ok, _u} = up |> ImageContext.create_image()
    redirect(conn, to: Routes.page_path(conn, :index))
  end

  def display(conn, %{"id" => id}) do
    i = Repo.get(Image, id)
    conn |> put_resp_content_type(i.content_type) |> send_file(200, Image.local_path(i))
  end

ImageContext.ex

def create_image(%{filename: _, path: tmp_path, content_type: _} = upload) do
    hash = File.stream!(tmp_path, [], 2048) |> Image.sha256()

    with {:ok, %File.Stat{size: size}} <- File.stat(tmp_path),
         data_merged <- Map.from_struct(upload) |> Map.merge(%{size: size, hash: hash}),
         {:ok, upload_cs} <- %Image{} |> Image.changeset(data_merged) |> Repo.insert(),
         :ok <- tmp_path |> File.cp(Image.local_path(upload_cs)) do
      {:ok, upload_cs}
    else
      {:error, reason} -> Repo.rollback(reason)
    end
  end

圖像架構(無變更集等)

schema "images" do
    field :filename, :string
    field :content_type, :string
    field :hash, :string
    field :size, :integer
  end
def local_path(%Image{} = upload) do
    [@upload_directory, "#{upload.id}-#{upload.filename}"] |> Path.join()
  end

輸出(在圖像顯示鏈接上)有效,但是當我轉到概述頁面時,所有帶有“ img”標簽的圖像都將生成,它們隨機加載失敗(有時它們都可以工作,有時不起作用,有時一半,有時一種有效而其他無效)

奇怪的是,當您檢查日志時,出現以下錯誤:

** (exit) an exception was raised:
    ** (File.Error) could not read file stats "uploads/images/1-user_upload_3.png": no such file or directory

文件在那里,並且當您重新加載或分開查看圖像時,它將起作用。

額外:問題的圖像。 同一頁面,只是重新加載了兩次: samplescreenshot1 samplescreenshot2

解決方案是使用絕對路徑。

顯然,Phoenix有時會更改當前工作目錄,例如在重新加載代碼時,因此相對路徑失敗。

歸功於Nobbz(Slack)和Jose Valim(Git問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM