在 Heroku 上复制 Phoenix 文件

Phoenix file copying on Heroku

我正在尝试将图像上传到我在 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 存储桶来解决。

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

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

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