无法在生产中显示上传的图片

时间:2016-09-08 20:30:41

标签: nginx file-upload elixir phoenix-framework

我已将文件上传添加到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之后。

我认为这是一切,但如果有帮助,我很乐意提供更多信息。

1 个答案:

答案 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变量