【问题标题】:Where should I store user-uploaded files and images in Phoenix/Elixir?我应该在 Phoenix/Elixir 中的哪里存储用户上传的文件和图像?
【发布时间】:2017-03-29 18:39:13
【问题描述】:

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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    首先有两种不同的选择:

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

    选择正确的选项在很大程度上取决于您的业务逻辑、用户和请求的数量以及您的部署策略(例如 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 没有涵盖这个话题,我想它可以改进。

    【讨论】:

    • 谢谢。如何从 a) 控制器 b) 视图中获取图像的路径/url?
    • arc docs。视图和控制器是一样的。
    • “/uploads”应该位于项目的根目录中的什么位置?如果是这样,它不会包含在输出版本生成的文件中吗?我不知道它叫什么——部署时?
    • 是的,根文件夹是这个地方,不,只有在defp elixirc_paths(_), do: ["lib", "web"] 中指定的路径才能转到_build
    • 但是它会被包含在编译好的Beam文件中?
    【解决方案2】:

    将此添加到 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/"中。但我只想将上传的图像存储在那里,静态图像应该存储在默认位置。有可能吗?
    • 我知道。我的问题是“我真的可以在a)视图(html)b)控制器中获取某个图像的路径吗?”也就是说,我不想在控制器或视图中硬编码“文件/”,我想做类似get_uploaded_image_url("image1.png") 的东西会返回图片的完整网址
    • 您的端点和您的路由器助手有 static_path 和 static_url 函数,您可以在这种情况下使用它们。
    • @Omin/var/www/app/files/目录的创建是怎么处理的,必须要为phoenix配置特殊权限吗?我很难理解在哪里创建文件夹......部署时在我的虚拟机中?在凤凰项目的某个地方?我对部署还知之甚少。
    • 默认情况下,endpoint.ex 指定plug Plug.static, at: "/", from: :app_name。在开发中,这使得将文件写入./web/static/filename.png 变得很容易,并且它们通过早午餐复制到priv/static 并提供服务。 Phoenix 可以将文件保存在生产环境中的相对路径上吗?如果有,怎么做?
    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多