【问题标题】:Serving images remotely or directly the Amazon S3 - Dragonfly Gem远程或直接在 Amazon S3 上提供图像 - Dragonfly Gem
【发布时间】:2014-03-27 07:29:21
【问题描述】:

我在 Heroku 上有一个应用程序,我正在使用 Amazon S3 来存储图像。我已经使用了我知道的所有缓存技术,但似乎图像加载速度太慢,这让一些用户望而却步。

目前用户得到

/media/W1siZiIsIjIwMTQvMDIvMjEvMjMvMjAvMDQvNTY1L01pa2VfOTIzMi5qcGciXV0/Mike_150.jpg?sha=d8993be2

根据instructions一个必须使用

Dragonfly.app.remote_url_for(uid)

他们会得到

http://my-bucket.s3.amazonaws.com/2011/04/01/03/03/05/243/file.jpg

但是,当我添加此行时,没有任何反应。

#require 'dragonfly/s3_data_store'
require 'dragonfly'

# Configure
Dragonfly.app.configure do
  plugin :imagemagick

  protect_from_dos_attacks true
  secret "2558d89a83f18f6da793e3b6dccc888c17642563e9ddedf456356f4c2d79"

  url_format '/media/:job/:name'


  response_header 'Cache-Control', 'public, max-age=3600'                    # You can set custom response headers
  response_header 'Cache-Control' do |job, request, headers|    # either directly or with a block
    job.image? ? "public, max-age=10000000" : "private"         # setting to nil removes the header
  end


  allow_legacy_urls true


  if Rails.env.test? || Rails.env.development?
    datastore :file,
              root_path: Rails.root.join('public/system/dragonfly', Rails.env),
              server_root: Rails.root.join('public')
  else
    datastore :s3,
              bucket_name: ENV['S3_BUCKET_NAME'],
              access_key_id: ENV['S3_KEY'],
              secret_access_key: ENV['S3_SECRET'],
              url_scheme: 'http',
              url_host: 'mybucket.s3.amazonaws.com'

  end

end


# Logger
Dragonfly.logger = Rails.logger

Dragonfly.app.remote_url_for(uid)

# Mount as middleware
Rails.application.middleware.use Dragonfly::Middleware

# Add model functionality
if defined?(ActiveRecord::Base)
  ActiveRecord::Base.extend Dragonfly::Model
  ActiveRecord::Base.extend Dragonfly::Model::Validations
end
  • 我做错了什么?
  • 服务文件远程 url 会改变应用程序的性能吗?

【问题讨论】:

  • 你能解决这个问题吗?
  • 遗憾的是我没能解决它。但我添加了一个验证,要求用户添加更小的图像尺寸。在另一个应用程序中,我决定放弃 Dragonfly gem 并使用carrierwave gem。我必须说这是一个更好的选择。 gem 'carrierwave' gem 'cloudinary'

标签: ruby-on-rails heroku amazon-s3 dragonfly-gem


【解决方案1】:

您直接从 S3 提供图像。根据您的用户在世界上的哪个位置与 S3 存储桶的区域,延迟和速度可能会有所不同。

加快此过程的一个选项是使用 AWS Cloudfront CDN 并将 S3 存储桶作为源服务器。

  1. 阅读Cloudfront and S3
  2. Dargonfly中也有引用

【讨论】:

    【解决方案2】:

    一段时间以来,我一直在为此苦苦挣扎。不幸的是,我还没有找到一个干净的解决方案,但我以一些可行的方法结束了。

    编写自己的 url 字符串就可以了:

    url = 'https://YOURBUCKET.s3.eu-central-1.amazonaws.com/' + picture.image_file_uid
    

    我希望这可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2011-05-12
      • 1970-01-01
      • 2014-07-14
      • 2011-09-01
      • 2017-04-26
      相关资源
      最近更新 更多