Подтвердить что ты не робот

Скрепка: загрузка с URL с расширением

Я хотел бы загружать изображения из URL-адресов с помощью paperclip на S3-хранилище. Я работаю с:

Ruby 1.9.3
Rails 3.2.6
paperclip 3.1.3
aws-sdk 1.3.9

У меня есть моя модель изображения:

class Asset

  has_attached_file :asset,
    :styles => {:thumb => "60x60>"},
    :storage => :s3,
    :s3_credentials => "#{Rails.root}/config/s3.yml",
    :path => "/pictures/:id/:style.:extension"

  validates_attachment_content_type :asset, :content_type => ['image/gif', 'image/jpeg', 'image/png', 'image/x-ms-bmp']

end 

Итак, в основном я сделал это, чтобы загрузить мой файл по URL-адресу:

picture = Asset.new(asset: open("http://www.my_url.com/my_picture.jpg"))
picture.save

Но он сохраняет мой файл с плохим именем файла и не устанавливает расширение файла:

#<Asset id: 5, asset_file_name: "open-uri20120717-6028-1k3f7xz", asset_content_type: "image/jpeg", asset_update_at: nil, asset_file_size: 91565, created_at: "2012-07-17 12:41:40", updated_at: "2012-07-17 12:41:40">
p.asset.url
  => http://s3.amazonaws.com/my_assets_path/pictures/5/original.

Как вы видите, расширение отсутствует.

Я нашел способ его решения, но я уверен, что у меня будет лучший способ. Это решение для копирования файла на моем компьютере, а затем отправлю его на S3 следующим образом:

filename = "#{Rails.root}/tmp/my_picture.jpg"
open(filename, 'wb') do |file|
  file << open("http://www.my_url.com/my_picture.jpg").read
end

picture = Asset::Picture.new(asset: open(filename))
picture.save

Это работает на моем компьютере:

#<Asset::Picture id: 10, asset_file_name: "my_picture.jpg", asset_content_type: "image/jpeg", asset_update_at: nil, asset_file_size: 91565, created_at: "2012-07-17 12:45:30", updated_at: "2012-07-17 12:45:30">
p.asset.url
  => "http://s3.amazonaws.com/assets.tests/my_assets_path/10/original.jpg"

Однако я не знаю, будет ли этот метод работать на Heroku (я размещаю свое приложение на нем).

Нет лучшего способа без прохождения временного файла?

4b9b3361

Ответ 1

Хорошее время. Я только что отправил запрос на растяжение, который был исправлен за несколько часов назад (20 июля 2012 г.), что должно сделать вашу жизнь реальной.

self.asset = URI.parse("http://s3.amazonaws.com/blah/blah/blah.jpg")

Это загрузит ваше jpeg-изображение, убедитесь, что имя файла blah.jpg, а тип содержимого - "image/jpg"

Версия скрепки > 3.1.3 (вам нужно будет связать ее с github repo, пока она не будет выпущена).

UPDATE: подтверждена работа с версией скрепки >= 3.1.4