Büroklammer: Upload von URL mit Erweiterung

Ich möchte Bilder von URLs per Büroklammer in den S3-Speicher hochladen. Ich arbeite mit :

Ruby 1.9.3
Rails 3.2.6
paperclip 3.1.3
aws-sdk 1.3.9

Ich habe mein Bild Model:

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 

Im Grunde genommen habe ich Folgendes gemacht, um meine Datei von einer URL herunterzuladen:

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

Aber meine Datei wird mit einem falschen Dateinamen gespeichert und die Dateierweiterung wird nicht festgelegt:

#<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.

Wie Sie sehen, gibt es keine Erweiterung.

Ich habe eine Methode gefunden, um das Problem zu lösen, aber ich bin sicher, dass ich einen besseren Weg finden kann. Diese Lösung besteht darin, die Datei auf meinen Computer zu kopieren und sie dann wie folgt auf S3 zu senden:

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

Das funktioniert auf meinem Computer:

#<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"

Ich weiß jedoch nicht, ob diese Methode auf Heroku funktioniert (ich hoste meine App darauf).

Gibt es keinen besseren Weg, ohne eine temporäre Datei zu übergeben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage