我已将文件上传添加到Phoenix应用程序,并且能够在开发中显示上传的图像,并在控制台中启动应用程序时在本地生成。
我的具体问题是,当我将图像上传到生产服务器时,文件会上传并复制到正确的目录中,但我无法从浏览器访问它们。
我的端点中的静态插头如下:
plug Plug.Static,
at: "/", from: :bookingmot, gzip: false,
only: ~w(css fonts images js html favicon.ico robots.txt)
plug Plug.Static, at: "/uploads", from: Upload.base_path, gzip: false
上传模块处理上传所需的任何任务,base_path的定义如下:
def base_path do
System.get_env("UPLOAD_PATH")
end
Env var UPLOAD_PATH在服务器上定义为:
/home/[username]/www/phoenix/[app-name]/uploads
# to clarify, the contents of [app-name] are the results of
# tar xfz app-release.tar when deploying
所有上传的文件都可以很好地复制到上面的目录中,但是如果我在浏览器中输入以下内容,我就会发现找不到页面。
http://[app-url]/uploads/[name-of-file-in-uploads-folder]
开发虚拟机和生产服务器都是Centos 7,生产应用程序位于Nginx之后。
我认为这是一切,但如果有帮助,我很乐意提供更多信息。
答案 0 :(得分:1)
我认为我遇到了类似的问题。
我的第一种方法如何:
#lib/endpoint.ex
plug Plug.Static,
at: "/uploads",
from: Application.get_env(:app_name, :full_upload_path),
gzip: false
#config/config.exs
config :app_name,
full_upload_path: Path.expand("./uploads")
我们使用两个单独的服务器进行编译,并使用部署目标。它不起作用,因为在编译路径期间扩展到/home/builds/app_name/uploads
而不是预期的/home/user/app_name/uploads
。
我们如何解决它:
#config/production.exs
config :app_name,
full_upload_path: "/home/user/app_name/uploads"
现在它在生产中使用硬编码路径并在其他地方扩展路径
TLDR:尝试在编译版本的机器上设置UPLOAD_PATH变量