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

时间:2016-08-10 05:52:41

标签: elixir phoenix-framework

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

2 个答案:

答案 0 :(得分:6)

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

  1. 您可以在本地存储上传内容
  2. 您可以将它们存储在外部服务上,例如Amazon S3
  3. 选择正确的选项在很大程度上取决于您的业务逻辑,用户数量和请求以及您的部署策略(例如Heroku不允许将上传的文件存储在他们的dynos上)。

    本地

    因此,this article中描述了本地存储文件的方式。简短的回答是:

    # lib/my_app/endpoint.ex
    
    plug Plug.Static,
      at: "/uploads", from: Path.expand("./uploads"), gzip: false 
    

    亚马逊

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

    {: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"
      ]
    

    基本上就是这样。请参阅full installation instructions

    P.S。很奇怪official docs没有涵盖这个主题,我想它可以改进。

答案 1 :(得分:4)

将此添加到 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这样的东西来提供生产环境中的文件可能是更好的选择。