travisf

travisf

Saved images not displaying on dev machine using filesystem

Locally all my images are 404 not found (haven’t tried this in production). This is a brand new implementation so I’m sure I got something mixed up along the way.

I’m using ex_aws to store images in production, but locally I am just using the filesystem. I use system configs to determine what gets uploaded where.

dev.exs:

config :app, App.Images.PostImages,
  provider: App.Storage.LocalProvider,
  root: Path.expand(Path.join(__DIR__, "../priv/static/images/posts")),
  url_prefix: "/pics"

LocalProvider:

  @doc """
  This is what fetches a URL of an uploaded image
  """
  @impl true
  def url(%{url_prefix: url_prefix}, key, _opts \\ []) do
    with :ok <- validate_key(key) do
      ok({:local, Path.join(url_prefix, key)})
    else
      res -> {:error, res}
    end
  end

endpoint.ex

 image_file_storage = Application.get_env(:app, App.Images.PostImages)

  if Keyword.fetch!(image_file_storage, :provider) == App.Storage.LocalProvider do
    plug Plug.Static,
      at: "/pics",
      from: Keyword.fetch!(image_file_storage, :root),
      gzip: false
  end

The url/3 function returns a url /pics/:image_key, which it does. And I can view the image if I navigate to ../priv/static/images/posts/:image_key but Phoenix is not finding localhost:4000/pics/:image_key. What am I missing? I’ve implemented this in other systems before, but this is the first time I’ve written all provider behaviours myself.

Marked As Solved

codeanpeace

codeanpeace

Hmm, did you try a relative path from app directory for the :root config value after changing to the preferred form for :from?

root: "priv/static/images/posts",

Or maybe even hardcoding it in just for now like so:
from: {:ciao, "priv/static/images/posts"},

Also Liked

codeanpeace

codeanpeace

If the code blocks were copied directly from the app, it looks like inconsistency referencing of modules where some are prefixed with App and others Ciao.

travisf

travisf

Ah! That did it. Interesting, in the dev.exs if I change root: Path.expand(Path.join(__DIR__, "/priv/static/images/posts")) to: root: "priv/static/images/posts" I get an error:

== Compilation error in file lib/ciao/images/post_images.ex ==
** (File.Error) could not make directory (with -p) "/priv/static/images/posts": no such file or directory
    (elixir 1.13.1) lib/file.ex:316: File.mkdir_p!/1
    lib/ciao/images/storage/local_provider.ex:13: Ciao.Storage.LocalProvider.init/1
    lib/ciao/images/post_images.ex:12: (module)

So now I have two variables, root and relative:

config :ciao, Ciao.Images.PostImages,
  provider: Ciao.Storage.LocalProvider,
  root: Path.expand(Path.join(__DIR__, "/priv/static/images/posts")),
  relative: "priv/static/images/posts",
  url_prefix: "/pics"

I find that to be a bit frustrating, but this is a side project so I’m happy to leave it as is for now. Thank you so much for your help!

Where Next?

Popular in Questions Top

skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40165 209
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

We're in Beta

About us Mission Statement