【问题标题】:Unable to render images in view (paperclip/AWS)无法在视图中呈现图像(回形针/AWS)
【发布时间】:2016-08-05 20:11:39
【问题描述】:

在过去的一天半里,我一直在浏览 SO 帖子,并提出了与此问题相关的另一个问题 here,但尚未提出解决方案。我无法渲染我的图像,这些图像在我的视图中使用<%= image_tag @user.avatar.url(:medium) %> 正确上传到了文档中指定的 AWS。

查看我的数据库,与头像相关的所有字段确实填充了:

avatar_file_name  => meditation.jpg       
avatar_content_type => image/jpeg                   
avatar_file_size => 109992 
avatar_updated_at => 2016-08-04 06:48:31.361434

并且可以通过双击我的亚马逊存储桶中的图像链接在浏览器中查看图像:https://s3.amazonaws.com/giving-tree-images/Users/sgau677/giving_tree/public/avatars/12/medium/meditation.jpg.jpg

如您所见,由于某种原因,附加了一个双文件扩展名,这是一个单独的问题(我欢迎对此提供反馈)但似乎不是问题,因为我无法在查看具有单个文件扩展名的上传图像。

因此,随着图像被上传,数据库字段被填充,并且没有错误 - 我不知道为什么我不能在视图中呈现它们。我怀疑问题是 1)路径 - 在我的模型中看起来像这样:

has_attached_file :avatar, 
:styles => { medium: "300x300#", thumb: "100x100#" },
:convert_options => {
:thumb => "-quality 75 -strip" }, 
:s3_host_name => "s3.amazonaws.com",
:path  => ":rails_root/public/:attachment/:id/:style/:filename.:extension",
:url => ":attachment/:id/:style/:filename.:extension",
:default_url => "default_img.png",
:storage => :s3,
:s3_credentials => {
  :bucket => 'giving-tree-images',
  :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
  :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
},
 :s3_permissions => {
  :original => 'public-read'
} 
validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/

attr_accessor :avatar_file_name, :avatar_content_type, :avatar_file_size, :avatar_updated_at

如您所见,这似乎是正确的(除非我应该去掉模型中的:rails_root 位?)

或 2)我需要以某种方式将图像的位置保存在单独的模型中(我见过其他人这样做,但不确定是否需要,因为其他人似乎没有这样做 - 他们可能只是没有提到他们这样做)。然而,这一步在我读过的任何文档中都没有。

3) 我还想知道是否有可能需要在开发中而不是生产中执行一个单独的过程?

或 4) 我正在使用 rails 4.2.3 并且在 cmets 中读到回形针不支持 aws > 2.00 的版本 - 但是 Heroku docs - 指示使用 2.3...所以也许这是问题所在?

gem "paperclip", "~> 5.0.0"
gem 'aws-sdk', '~> 2.3'

我还在其他帖子中设置了一个 config/asw.yml 文件,如下所示:

development:
  access_key_id:  <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

production:
  access_key_id:  <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

虽然我不确定它是否被读取(ENV var 存储在 secrets.yml 中,以及本地和通过终端的 heroku 中)和一个如下所示的 config/s3.yml 文件:

include 'secrets.yml'

development:
 access_key_id:  <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
 bucket: <%= ENV["S3_BUCKET_NAME"]%>

production:
 access_key_id:  <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
 bucket: <%= ENV["S3_BUCKET_NAME"]%>

初始化器/s3.rb

if Rails.env == "production"
 # set credentials from ENV hash
 S3_CREDENTIALS = { :access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'], :bucket => "giving-tree-images"}
else
 # get credentials from YML file
 S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end

并修改了我的环境/development.rb 和我的环境/production.rb 以包括:

  config.paperclip_defaults = {
  storage: :s3,
  :s3_host_name => "s3.amazonaws.com",
  s3_credentials: {
    bucket: ENV.fetch('S3_BUCKET_NAME'),
    access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
    secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
    s3_region: ENV.fetch('AWS_REGION'),
  }
}

...根据多个其他帖子的组合建议。很可能我不需要所有这些,所以如果有人可以帮助我了解我应该摆脱什么,以及为什么我不能在视图中渲染图像 - 我真的很感激,因为这太令人抓狂了。

【问题讨论】:

  • 您是否尝试过不必定义 :path 和 :url 而只使用默认路径?看看这是否适合你?
  • 感谢您的回复!我尝试只使用:url,然后只使用:path,然后省略它们,没有运气

标签: ruby-on-rails amazon-web-services amazon-s3 paperclip


【解决方案1】:

对于:path:url,您将extension 放在:filename 之后——但您不应该这样做。

:filename 包含扩展名。这就是为什么你会得到扩展两次

你的模型中有这个: :path => ":rails_root/public/:attachment/:id/:style/:filename.:extension", :url => ":attachment/:id/:style/:filename.:extension",

在你删除 .:extension 之后,你应该有这个: :path => ":rails_root/public/:attachment/:id/:style/:filename", :url => ":attachment/:id/:style/:filename",

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2019-07-22
    • 2012-09-13
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多