【问题标题】:Broken images when seeding database on heroku在heroku上播种数据库时损坏的图像
【发布时间】:2013-12-12 05:33:22
【问题描述】:

我有一个使用回形针附加照片的 Rails 4 应用程序。我的 db/seeds.rb 文件为我的 Person 模型添加了一些照片,如下所示:

Person.create(:first_name => 'Jon', :last_name => 'Snow', 
      :photo => File.open("#{Rails.root}/app/assets/images/jon-snow.png))

在我的 app/models/person.rb 文件中,我将 :photo 作为回形针附件进行裁剪和调整大小:

class Person < ActiveRecord::Base
  has_attached_file :photo, 
  :styles => { :medium => "256x256#", :small => "64x64#", :tiny => "24x24#" },
            :default_url => :set_default_avatar,
            :url  => "/assets/photos/:id/:style/:basename.:extension",
            :path => ":rails_root/public/assets/photos/:id/:style/:basename.:extension"
  validates_attachment_size :photo, :less_than => 5.megabytes
  validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/png']

我的问题是,当我尝试将其部署到 heroku(使用 Cedar 堆栈)然后为数据库播种时,图像都显示为损坏。但是,在我的本地计算机上一切正常。

heroku 上生成的损坏的图像标签可能类似于:

<img alt="Jon Snow" src="/assets/photos/21/small/jon-snow.png?1386825683">

有谁知道为什么这个链接会在 heroku 上断开,但在我的电脑上却没有?我知道 heroku 正在生成调整大小的照片,因为 heroku 控制台输出的内容类似于这篇文章中的内容:Seed images in heroku with paperclip.
但是,它将它们放入 public/assets 而不是控制器指定的 public/assets/photos/:id/:style/:basename.:extension 中。

我已尝试执行链接帖子中提到的操作以及运行:

heroku run rake assets:precompile

还有很多其他的东西,但没有任何效果。任何帮助将不胜感激。

【问题讨论】:

  • 另外,我应该提到从网页手动上传文件到 heroku 工作正常。但是问题发生在数据库中。

标签: ruby-on-rails ruby heroku


【解决方案1】:

这个问题和我在这个答案How to use paperclip with rails and how does it work in deployment?中描述的一样

legacy Bamboo stack 有一个read-only file system,因此您无法在文件系统上写入。

new Cedar stack中,文件系统不再是只读的,所以上传不会失败。但是,您应该继续使用 AWS 或任何其他外部存储,因为 Heroku 将您编译的应用程序分布在多台机器上,并且不能保证从另一个请求中可以看到该图像。他们称之为ephemeral filesystem

换句话说,您应该继续使用 AWS 或 Heroku 文件系统之外的任何其他存储

【讨论】:

  • 感谢您的回复。我可能不得不选择 AWS。但是,通过 Web 界面上传的文件怎么会显示得很好,而通过 db 播种创建的文件却被破坏了呢?如果它们都只是存储在 Heroku 上的某个未分发的缓存系统中,它们不会都显示为损坏吗?
  • 因为您通过控制台访问 Heroku 时连接(并保存文件)的机器很可能不是您使用 HTTP 接口时连接的机器。
【解决方案2】:

来自heroku-dev

slug 的文件系统是只读的,这意味着你不能 动态写入文件系统以进行半永久存储。这 不支持以下类型的行为: 公共目录将上传的资产保存到本地磁盘(例如 attachment_fu 或 回形针

使用AWS S3

【讨论】:

  • 我正在与 offthewahls 合作开展这个项目,该评论仅适用于竹栈。该项目位于 Cedar 堆栈上。
  • 请在问题上指出这一点,因为它很重要。我可能是错的,但是:Heroku 上只有一个可写文件夹,这是 tmp 文件夹,您也应该将其配置为上传的 tmp 文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2012-08-20
  • 2015-06-09
  • 2011-01-08
  • 2023-03-12
相关资源
最近更新 更多