在 Heroku 上复制 Phoenix 文件

Posted

技术标签:

【中文标题】在 Heroku 上复制 Phoenix 文件【英文标题】:Phoenix file copying on Heroku 【发布时间】:2017-09-19 22:21:08 【问题描述】:

我正在尝试将图像上传到 Heroku 上的 Phoenix 应用程序。我有一个简单的应用程序,它遵循从Phoenix's docs 上传文件的说明。

我有一个简单的表单,控制器使用File.cp_r() 从临时目录复制文件。

  def create(conn, %"user" => user_params) do
    if upload = user_params["photo"] do
      File.cp_r(upload.path, "priv/static/images/foo.jpg") #non-dynamic name, doens't matter
    end
    ...
  end

作品只是在我的本地文件。但是,当我将其上传到 Heroku 时,在目录中测试表单和 heroku run find,我什么也没看到。

我注意到heroku上的这个目录有一个看似令人生畏的特权:

drwx------ 2 u25619 dyno 4096 Apr 23 05:14 images

我尝试加入一个漂亮的小File.chmod("priv/static/images", 0o777),但无济于事;该目录似乎对我来说是锁定的,所以我认为这是一个 heroku 问题。

知道如何处理吗?

编辑:通过使用 phoenix dep ex_aws 上传到 Amazon S3 存储桶来解决。

ex_aws dependency partial explanation(注意:你需要添加毒药和hackney才能使这个工作,它们没有被提及)

【问题讨论】:

尝试File.cp_r!,这将引发错误,原因是您可以在日志中阅读。 (如果需要,File.chmod! 也一样。)如果您在进行更改后发布详细日志,我们可能会提供更多帮助。您也可以只使用IO.inspect(File.cp_r(...)) 来记录该函数的返回值。 @Dogbert File.cp_r! 什么都没有显示,IO.inspect(File.cp_r(...)) 显示:ok, ["priv/static/images/foo.jpg"],仍然什么都没有。 你能确认这没有返回吗:heroku run find . | grep 'priv/static/images/foo.jpg'? @Dogbert 确认。正如下面提到的 Navin Peiris,它完全展示了一个不同的实例。我的实例也没有显示该文件,所以如果该文件被存储在另一个实例中,我就不会看到它......因为我现在要使用 S3,所以没有实际意义。 【参考方案1】:

heroku 上的文件系统是短暂的,您将无法访问您在跨部署或启动新实例时保存在其上的任何文件。

此外,当您运行 heroku run 时,您并没有连接到当前正在运行您的应用的同一个实例,而是启动一个新实例,这样那些上传的文件就不会在那里存在。

更好的方法是将上传的文件保存到 S3 或类似的文件中,您仍然可以跨部署访问它。

【讨论】:

heroku run 直接启动另一个实例这一事实非常重要。我什至没有注意到这一点,浪费了大量时间想知道为什么 Phoenix 没有报告任何错误,但文件却没有出现在我的 heroku run bash...

以上是关于在 Heroku 上复制 Phoenix 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 elixir phoenix 应用程序部署到 heroku - 无法添加 buildpack

使用 Webpack 将语义 UI 添加到 Phoenix v1.4.3

JDBC phoenix

我可以在 Heroku 上使用基于文件的数据库吗?

如何在 Heroku 上 rake db:drop 和 rake db:create? [复制]

在 Heroku 上部署现有的 Django 应用程序