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?