我最近在Heroku上的rails应用程序上部署了我的ruby,我正在使用pg gem作为我的数据库。
我创建了一个页面,我可以在其中上传图像并将其显示在主页面上,并将它们保存在应用程序的公共文件夹中。
当我部署它工作正常,但过了一段时间后图像消失了。当我查看我的Heroku日志时,我得到了以下内容:
ActionController::RoutingError (No route matches [GET] "/assets/products/6/photos/medium/shanab.jpg"):
我认为图片已保存,但我不知道如何查看它们是否仍在那里。
答案 0 :(得分:0)
但过了一段时间后,图像消失了
Heroku运行ephemeral file system
,这意味着每次部署新版本的代码时,旧文件/代码都会被覆盖:
每个dyno都有自己的短暂文件系统,带有最近部署代码的新副本。在dyno的生命周期中,其运行进程可以将文件系统用作临时暂存器,但是任何其他dyno中的进程都不会看到所写的文件,并且在dyno停止或重新启动时,所写的任何文件都将被丢弃。
这意味着即使您的图像正在运行一段时间,每个新部署也将基本覆盖它们。这可能是问题的原因,但我不能确定没有进一步检查。
-
解决这个问题的方法是使用CDN,最常见的(尽管不正确)是将您的应用与S3
绑定。
我不知道您正在使用哪个资产处理宝石,但如果它是Paperclip
,您将需要使用inbuilt S3 functionality将所有图片资源放到亚马逊的服务器上:< / p>
#app/models/x.rb
class x < ActiveRecord::Base
has_attached_file :download,
:storage => :s3,
:s3_credentials => Proc.new{|a| a.instance.s3_credentials }
def s3_credentials
{:bucket => "xxx", :access_key_id => "xxx", :secret_access_key => "xxx"}
end
end