无法在视图中呈现图像(paperclip / AWS)

时间:2016-08-05 20:11:39

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

在过去的一天半里,我一直在搜索SO帖子,并且已经提出了与此问题有关的另一个问题here,并且尚未提出解决方案。我无法使用文档中指定的<%= image_tag @user.avatar.url(:medium) %>在我的视图中正确上传我的图像。

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

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)我需要以某种方式将图像的位置保存在一个单独的模型中(我已经看过其他ppl,但我不确定它是否需要,因为其他人似乎没有这样做 - 授予他们可能只是没有提到他们这样做了)。然而,这是我所阅读的任何文档中的一个步骤。

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

或4)我正在使用rails 4.2.3,并在评论中读到回形针不支持aws的版本&gt; 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'),
  }
}

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

1 个答案:

答案 0 :(得分:0)

extension :filename :path:url之后的: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", 后,你应该这样: /*function: f_dw_saveasformattedtext(dw_1, ls_filename, ';') parameters: adw_dw(datawindow/datastore), as_filename (string), as_separator(string) */ long ll_row, ll_rows, ll_colcount, ll_colindex string ls_colname, ls_coltype, ls_value, ls_lineval int li_filenum any la_anyval ll_rows = adw_dw.rowcount() ll_colcount = long(adw_dw.Describe("DataWindow.Column.Count")) li_filenum = FileOpen(as_filename, LineMode!, Write!, LockWrite!, Append!) if li_filenum = -1 or isnull(li_filenum) = true then return -1 end if for ll_row = 1 to ll_rows ls_lineval = '' for ll_colindex = 1 to ll_colcount ls_colname = adw_dw.describe("#" + string(ll_colindex) + ".Name") ls_coltype = adw_dw.Describe ( ls_colname + ".ColType" ) CHOOSE CASE Lower ( Left ( ls_coltype , 5 ) ) CASE "char(", "char","strin" // CHARACTER DATATYPE la_anyval = adw_dw.GetItemString ( ll_row, ls_colname ) CASE "date" // DATE DATATYPE la_anyval = adw_dw.GetItemDate ( ll_row, ls_colname ) CASE "datet" // DATETIME DATATYPE la_anyval = adw_dw.GetItemDateTime ( ll_row, ls_colname ) CASE "decim" // DECIMAL DATATYPE la_anyval = adw_dw.GetItemDecimal ( ll_row, ls_colname ) CASE "numbe", "long", "ulong", "real", "int" // NUMBER DATATYPE la_anyval = adw_dw.GetItemNumber ( ll_row, ls_colname ) CASE "time", "times" // TIME DATATYPE la_anyval = adw_dw.GetItemTime ( ll_row, ls_colname ) CASE ELSE SetNull ( la_anyval ) END CHOOSE ls_value = string(la_anyval) if trim(ls_lineval) = '' then ls_lineval = ls_value else ls_lineval += as_separator + ls_value end if next //columns FileWrite(li_filenum, ls_lineval) next //rows return 1