Serving static files from a phoenix API

I’m trying to serve a file from my phoenix API, and believe Plug.Static is the way to do it, but am struggling to get it to work.

The file is an apple certificate, and I’m placing it in priv/certificates/apple

I’ve setup the following code in my endpoint.ex file:

plug Plug.Static,
    at: "/.well-known/apple",
    from: :my_app,
    gzip: false,
    only: ~w(certificates apple)

But when I visit the URL I get no route found for GET /.well-known/apple.

Do I need to add this to my routes file? And if so, does it hit a controller? What would that controller action look like?

Thanks in advance

How about simply putting it in priv/static/...?

2 Likes

The default path for reading static files is priv/static, so you need to tweak it:

plug Plug.Static,
    # Note the root path.
    at: "/.well-known",
    from: {:my_app, "priv/certificates"},
    gzip: false,
    only: ~w(apple)

But I’d suggest following @silverdr advice and put the files in the usual location. Assuming the actual file is called apple, try this:

  • Put the file into static: /priv/static/.well-known/apple
  • Use “standard” Static plug config:
  plug Plug.Static,
    at: "/",
    from: :my_app,
    gzip: false,
    only: [".well-known"]
2 Likes

I must have misread - I thought files had to go into /priv and not /priv/static - many thanks both and for the specific code example

Anyone struggling with this ?

What’s the problem? Doesn’t the accepted solution work for you?

I have a problem with the MIME type the server is sending to the browser. On image files the user uploads. I am saving the images locally in fly.io volumes (I am hosting my projects in fly.IO) and putting the address in a column in the users table(postgres). 60% of the time the browser receives it with content type in the HTTP response header as “text/html” and the other 40% of the time it is sent correctly as “image/jpeg”. For me, this is an advanced problem I am not ready to tackle yet. I will continue to learn Phoenix and LV in the future I will come back to this issue. Maybe I will just skip this approach and use AWS S3 like solution instead of serving the images from my local folder.

You could post your relevant router config and maybe somebody else can chime in?