[英]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
文件在那里,並且當您重新加載或分開查看圖像時,它將起作用。
解決方案是使用絕對路徑。
顯然,Phoenix有時會更改當前工作目錄,例如在重新加載代碼時,因此相對路徑失敗。
歸功於Nobbz(Slack)和Jose Valim(Git問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.