Rails 3 - проблема скрепки Amazon S3 EU - PullRequest
11 голосов
/ 31 августа 2011

Я использую:

Paperclip 2.3.16
Rails 3.0.9
Ruby 1.9.2
AWS - S3 0.6.2

Я пытаюсь использовать скрепку для загрузки в ведро на основе ЕС (Ирландия).В моей модели есть следующее:

has_attached_file :image, :styles => { :grid => '90x128#', :list => '140x200#', :original => '400x548'},
            :storage => :s3,
                      :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                      :url  => 'flyers/:id/:style/:basename.:extension',
                      :path => 'flyers/:id/:style/:basename.:extension',
                      :bucket => 'fsight'

В моем environment.rb я установил запись для использования хоста по умолчанию AWS / s3 на соответствующий EU, используя:

require "aws/s3"
AWS::S3::DEFAULT_HOST.replace "s3-eu-west-1.amazonaws.com"

Это работает нормально, и это позволяет мне загружать изображения, и я могу проверить загрузку / удаление изображений с помощью Консоли управления AWS.

Однако у меня возникла проблема при попытке отобразить изображения на моемсайт.Изображения не загружаются, и я определил причину, поскольку созданный URL-адрес использует старый хост по умолчанию.Например:

Что должно быть: https://s3 -eu-west-1.amazonaws.com / fsight / flyers / 50 / full / 4759543368588654950.jpg

Что это на самом деле: http://s3.amazonaws.com/fsight/flyers/50/full/4759543368588654950.jpg?1314801178

Как видите, он использует старый хост по умолчанию.

Я попытался разместить:

Paperclip.interpolates(:s3_eu_url) do |att, style|
    "#{att.s3_protocol}://s3-eu-west-1.amazonaws.com/#{att.bucket_name}/#{att.path(style)}"
end

Но затем начал получать следующую ошибку:

 wrong number of arguments (0 for 1)

Extracted source (around line #9):

 <img src= <%= @event.image.url(:original) %>

Я знаю, что у Paperclip есть некоторые проблемы с использованием EU Buckets, но кто-нибудь может мне помочь с этим?

Ответы [ 4 ]

31 голосов
/ 01 июля 2012

Вам больше не нужно обходить проблему с ЕС.

Стандартное хранилище aws-s3 для хранения в paperclip было заменено на AWS SDK для Ruby , который также являетсяАмазон рекомендовал способ при работе с AWS.

Просто вставьте

gem 'aws-sdk'

в ваш Gemfile и запустите bundle install.

Если вы хотите что-то вроде https://s3 -eu-west-1.amazonaws.com / some_path_goes_here , попробуйте настроить has_attached_file вашей модели со следующими параметрами

:storage => :s3,
:s3_credentials => "#{Rails.root}/config/s3.yml",
:s3_permissions => :private,
:s3_protocol => 'https',
:s3_host_name => 's3-eu-west-1.amazonaws.com',
:path => ":filename"

Если вы не хотите использовать https, вы можете удалить:s3_protocol и, если вы хотите изменить регион, опция :s3_host_name - правильный путь.Вы также можете поместить это в файл конфигурации.

Надеюсь, это поможет.

8 голосов
/ 31 августа 2011
5 голосов
/ 08 ноября 2013

Я добавил

Paperclip::Attachment.default_options[:s3_host_name] = 's3-eu-west-1.amazonaws.com'

на paperclip.rb в папке инициализаторов, и он прекрасно работает для меня.

2 голосов
/ 19 июня 2012

Та же проблема здесь, только что решил передать следующую опцию has_attached_file :

:url => ':s3_domain_url' 

Подробнее см. Здесь http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3:

Как правило, это ни в коем случае не имеет значения, и вы можете оставить значение по умолчанию (тип пути или: s3_path_url). Но в некоторых случаях пути не работают, и вам нужно использовать стиль домена (: s3_domain_url).

...