我应该在哪里将用户上传的文件和图像存储在Phoenix/Elixir中?

12 elixir phoenix-framework

我的应用程序的用户应该能够上传图像等文件.在哪个文件夹中,我应该保存这些文件?我对部署Elixir/Phoenix应用程序并不熟悉,但我不希望将这些文件包含在我部署应用程序时生成的输出打包文件中.换句话说,我不想以某种方式将上传的图像和文件静态嵌入到我的应用程序中.那么我应该在哪里存储它们?

sob*_*evn 6

首先,有两种不同的选择:

  1. 您可以在本地存储上传内容
  2. 您可以将它们存储在外部服务上,例如Amazon S3

选择正确的选项在很大程度上取决于您的业务逻辑,用户数量和请求以及您的部署策略(例如Heroku不允许在其dynos上存储上传的文件).

本地

因此,本文介绍了本地存储文件的方式.简短的回答是:

# lib/my_app/endpoint.ex

plug Plug.Static,
  at: "/uploads", from: Path.expand("./uploads"), gzip: false 
Run Code Online (Sandbox Code Playgroud)

亚马逊

在处理Amazon S3时,您仍然会使用arc,基本设置将与上面的文章保持一致,但事情略有不同,需要稍微重新配置您的应用程序:

加入{:ex_aws, "~> 0.4"},deps.并添加到配置:

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"
  ]
Run Code Online (Sandbox Code Playgroud)

基本上就是这样.请参阅完整安装说明.

PS很奇怪官方文档没有涵盖这个主题,我想它可以改进.


Cha*_*Han 5

将此添加到app / lib / app / endpoint.ex

plug Plug.Static,
  at: "files/", from: "/var/www/app/files/", gzip: false
Run Code Online (Sandbox Code Playgroud)

并将上传的文件存储在 /var/www/app/files/

这些文件将在http:// localhost:PORT / files /下提供

您可以在https://hexdocs.pm/plug/Plug.Static.html上了解更多信息。

另外,根据您的要求,使用诸如nginx之类的文件在生产环境中提供文件可能是更好的选择。

  • 您的端点和路由器助手具有static_path和static_url函数,您可以在这种情况下使用它们。 (4认同)