Paperclip S3 - Можно загружать изображения, но не просматривать их

Я создал приложение Rails, работающее на Heroku, с Paperclip и S3. Мне удалось загрузить изображения в мой ведро S3 через сайт (я вижу, что они отображаются в моем ковше на панели управления Amazon).

Но когда я добавляю тег Image i.e. <% = image_tag x.photo.url% > , я получаю следующий html (здесь пропущены теги), без отображения изображения!

img alt= "Test_tree" src= "http://s3.amazonaws.com/hiphotos/ads/photos/000/000/015/original/test_tree.jpg?1344661020"

Пожалуйста, помогите! Почему я не вижу изображения, даже если они находятся в ведре?

Большое спасибо ребятам

Ответы

Ответ 1

Во-первых, URL-адрес, который вы пытаетесь использовать в своем коде, таков:

http://s3.amazonaws.com/hiphotos/ads/photos/000/000/015/original/test_tree.jpg

При посещении этой ссылки в браузере вы увидите следующее:

<message>
  The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
</Message>
<RequestId>810A6AE1D141304C</RequestId>
<Bucket>hiphotos</Bucket>
<HostId>
  XXZ+s+slgZLsRWy5NiU/G0yAKBLftw0oT2dDKpas532qXJEPSrISVPqfZsEgpb2J
</HostId>
<Endpoint>hiphotos.s3.amazonaws.com</Endpoint>

Итак, если мы изменим URL-адрес с помощью правильной конечной точки, получим следующее:

http://hiphotos.s3.amazonaws.com/ads/photos/000/000/015/original/test_tree.jpg

Что возвращает правильное изображение.

Если вы используете европейские ведра, это может произойти, и это может быть ошибка того драгоценного камня, который вы используете, чтобы подтолкнуть вещи к s3.

Есть множество статей о том, как заставить Paperclip, S3 и европейские ведра хорошо играть вместе.

Я нашел, что, поскольку я начал использовать asset_sync, который использует Fog вместо aws-s3, я не знаю У вас больше проблем с скрепкой и S3.

Поэтому я подозреваю, что Туман имеет какое-то отношение к тому, чтобы эта проблема ушла для меня. Я бы рекомендовал переключиться на него, если вы используете что-то еще.

Ответ 2

Создайте файл, называемый инициализатором paperclip:

# config/initializers/paperclip.rb 
# We are actually setting this to 's3_domain_url', 
# so it not a placeholder for something else. 
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'

Или вы также можете разместить это внутри production.rb:

config.paperclip_defaults = {
    :storage => :s3,
    :s3_credentials => {
        :bucket => ENV['S3_BUCKET_NAME'],
        :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
        :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    },
    :url =>':s3_domain_url',
    :path => '/:class/:attachment/:id_partition/:style/:filename',
}