Rails 4.2中使用Paperclip+S3时,image_tag无法显示图片该如何排查?
问题分析与解决方案
我之前也碰到过一模一样的问题!结合你的代码来看,问题出在Paperclip和AWS SDK 2.x的配置兼容上,导致生成的S3图片URL无法被浏览器正确解析,所以image_tag只能显示图片标题而无法加载图片。你需要补充两个关键的S3配置项:
具体修改步骤
添加
s3_host_name配置
这是官方针对Rails 4.2 + Paperclip + AWS SDK 2.x组合给出的临时兼容方案,用来指定正确的S3存储节点域名:# 可在config/initializers/paperclip.rb或对应环境配置文件(如config/environments/production.rb)中添加 Paperclip::Attachment.default_options.merge!( storage: :s3, s3_credentials: { bucket: ENV['AWS_BUCKET'], access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], region: ENV['AWS_REGION'] }, s3_host_name: "s3-#{ENV['AWS_REGION']}.amazonaws.com" # 新增该行 )显式声明
s3_protocol为HTTPS
AWS SDK 2.x不再默认使用HTTPS协议,必须显式指定,否则生成的URL可能因协议不匹配或域名格式错误无法访问:# 在上述配置块中添加该行 s3_protocol: :https
验证修改
完成配置后重启Rails服务器,再次访问Recipe的show页面,image_tag @recipe.image.url(:original)就能生成可正常访问的HTTPS URL,图片也会正确显示了。
你的原始代码参考
recipe.rb
class Recipe < ActiveRecord::Base has_attached_file :image, styles: { thumb: '100x100>', square: '200x200#', medium: '300x300>' } validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ validates_with AttachmentSizeValidator, attributes: :image, less_than: 1.megabytes end
show.html.erb
<p id="notice"><%= notice %></p> <p> <strong>Name:</strong> <%= @recipe.name %> </p> <div class="col-xs-12" style="height:400px"> <%= image_tag @recipe.image.url(:original) %> </div> <%= link_to 'Edit', edit_recipe_path(@recipe) %> | <%= link_to 'Back', recipes_path %>
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

