【问题标题】:Paperclip does not show image but instead shows title with amazon s3 in rails?Paperclip 不显示图像,而是在 rails 中显示带有 amazon s3 的标题?
【发布时间】:2020-01-10 22:40:11
【问题描述】:

我正在使用回形针和 amazon s3 为我的网站存储图像。在开发模式下,如果没有 s3,一切都可以正常工作,但是当我尝试使用 s3 时,它会显示图像的标题而不是图像。我已经复制了 heroku 指南 https://devcenter.heroku.com/articles/paperclip-s3 中的内容。

这是宝石文件

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

这是在类配置文件的 profile.rb 中

has_attached_file :avatar,
                       :styles => { :medium => "300x300>", :thumb => "100x100>" },
                       :default_url => ":style/missing.jpg"
    validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

这是在生产中.rb

config.paperclip_defaults = {
    storage: :s3,
    s3_host_name: "s3-#{ENV['AWS_REGION']}.amazonaws.com",
    :s3_protocol => :https,
    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'),
    }
  }

观看次数

<%= image_tag @user.profile.avatar.url(:medium) %>  

我已经复制了 heroku 指南并添加了主机名和 s3 协议位。这里有什么问题?

【问题讨论】:

    标签: ruby-on-rails heroku amazon-s3 paperclip


    【解决方案1】:

    我已遵循 heroku 指南,并成功地在开发环境中使用回形针将用户图像上传到 S3,并且我还可以在用户个人资料中看到该图像。

    我的Gemfile

    gem 'paperclip'
    gem 'aws-sdk-s3'
    

    我的development.rb

    config.paperclip_defaults = {
    storage: :s3,
    s3_host_name: "s3.#{ENV['AWS_REGION']}.amazonaws.com",
    s3_protocol: :https,
    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'),
      }
    }
    

    你有这个(这可能会导致问题):

    s3_host_name: "s3-#{ENV['AWS_REGION']}.amazonaws.com",
    

    我有这个(s3 后面的一个点):

    s3_host_name: "s3.#{ENV['AWS_REGION']}.amazonaws.com",
    

    我的user.rb和你的一样

    has_attached_file :avatar,
                           :styles => { :medium => "300x300>", :thumb => "100x100>" },
                           :default_url => ":style/missing.jpg"
    
    # Validate the attached image is image/jpg, image/png, etc
    validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
    

    我的show.html.erb

    <%= image_tag @user.avatar.url(:medium) %>
    

    我使用的是 rails 5.2 版本,上面的代码对我有用。还要检查您的 S3 存储桶是否可以公开访问对象。

    【讨论】:

    • 嗨,当我执行您所做的操作时,它显示 LoadError(无法加载此类文件 - aws-sdk(您可能需要安装 aws-sdk gem)):这就是我更改 gem 的原因回到 gem 'aws-sdk', '~> 2.3' 但它显示了同样的错误并且图片没有显示但标题显示了。感谢您的帮助!
    • 另外,当我检查我的存储桶时,图像就在那里!
    • 我公开了所有内容,现在可以了。但是公开它有危险吗?
    • 公开您的 S3 存储桶以进行写入、更新和删除是很危险的。您也可以仅通过编程模式限制对存储桶的写入访问(拥有密钥对的人只能修改。这是通过 IAM 策略实现的)。对于读取操作,这取决于您是否要保护您的图像/数据不被公众访问。有多种方法可以保护您的 s3 资源。看看这个链接aws.amazon.com/premiumsupport/knowledge-center/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多