Read files in Phoenix in production mode

2019-07-23 12:59发布

问题:

I've Phoenix app (I created it with --api flag) that has some additional data required to process requests that I store in priv/data/filters.csv.

So it works fine in dev mode, I can read this file like: File.stream!("priv/data/filters.csv"), but once app is delivered using mix edeliver update this file is not accessible anymore.

I can see this folder in build directory, but after app is delivered there is no such folder priv. I'm not sure why it's not copied to deliver folder.

What I'm doing wrong? Do I need to copy these files after deliver process? Where can I store my files that I have to use in prod mode?

回答1:

You should use :code.priv_dir/1 to get the absolute path to the priv directory of your application at runtime. This will work with Erlang releases created by e.g. Distillery:

File.stream!(Path.join(:code.priv_dir(:my_app), "data/filters.csv"))

For me, after doing MIX_ENV=prod mix release, the file priv/foo is copied to _build/prod/lib/my_app/priv/foo.



回答2:

I had a similar issue and managed to resolve it using Application.app_dir(my_app, "priv")



回答3:

You should check your configuration in the lib/YOUR_APP/endpoint.ex. By default Plug.Static white lists the files that are served. Try adding your files at the only: ~w(...) list.