在 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 存储桶来解决。
【问题讨论】:
尝试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