【发布时间】:2017-03-29 18:39:13
【问题描述】:
我的应用程序的用户应该能够上传图像等文件。我应该在什么文件夹中保存这些文件?我对部署 Elixir/Phoenix 应用程序不是很熟悉,但我不想将这些文件包含在我部署应用程序时生成的输出、打包文件中。换句话说,我不想以某种方式将上传的图像和文件静态地嵌入到我的应用程序中。那么我应该将它们存放在哪里?
【问题讨论】:
我的应用程序的用户应该能够上传图像等文件。我应该在什么文件夹中保存这些文件?我对部署 Elixir/Phoenix 应用程序不是很熟悉,但我不想将这些文件包含在我部署应用程序时生成的输出、打包文件中。换句话说,我不想以某种方式将上传的图像和文件静态地嵌入到我的应用程序中。那么我应该将它们存放在哪里?
【问题讨论】:
首先有两种不同的选择:
选择正确的选项在很大程度上取决于您的业务逻辑、用户和请求的数量以及您的部署策略(例如 Heroku 不允许在其测功机上存储上传的文件)。
因此,在本地存储文件的方式在this article 中进行了描述。简短的回答是:
# lib/my_app/endpoint.ex
plug Plug.Static,
at: "/uploads", from: Path.expand("./uploads"), gzip: false
在处理 Amazon S3 时,您仍将使用 arc,基本设置将与上述文章中的相同,但情况略有不同,需要稍微重新配置您的应用程序:
将{:ex_aws, "~> 0.4"}, 添加到部门。
并添加到配置中:
config :arc,
bucket: "your-bucket",
virtual_host: true
config :ex_aws,
access_key_id: System.get_env("AWS_ACCESS_KEY_ID"),
secret_access_key: System.get_env("AWS_SECRET_ACCESS_KEY"),
s3: [
scheme: "https://",
host: "your-region.amazonaws.com",
region: "your-region"
]
基本上就是这样。见full installation instructions。
附:很奇怪official docs 没有涵盖这个话题,我想它可以改进。
【讨论】:
defp elixirc_paths(_), do: ["lib", "web"] 中指定的路径才能转到_build。
将此添加到 app/lib/app/endpoint.ex
plug Plug.Static,
at: "files/", from: "/var/www/app/files/", gzip: false
并将上传的文件存储在/var/www/app/files/
文件将发送至 http://localhost:PORT/files/
您可以通过https://hexdocs.pm/plug/Plug.Static.html了解更多信息
此外,根据您的要求,使用 nginx 之类的工具在生产环境中提供文件可能是更好的选择。
【讨论】:
"/var/www/app/files/"中。但我只想将上传的图像存储在那里,静态图像应该存储在默认位置。有可能吗?
get_uploaded_image_url("image1.png") 的东西会返回图片的完整网址
/var/www/app/files/目录的创建是怎么处理的,必须要为phoenix配置特殊权限吗?我很难理解在哪里创建文件夹......部署时在我的虚拟机中?在凤凰项目的某个地方?我对部署还知之甚少。
plug Plug.static, at: "/", from: :app_name。在开发中,这使得将文件写入./web/static/filename.png 变得很容易,并且它们通过早午餐复制到priv/static 并提供服务。 Phoenix 可以将文件保存在生产环境中的相对路径上吗?如果有,怎么做?