2012-07-17 4 views
13

Vorrei caricare le immagini dagli URL di paperclip sull'archivio S3. Io lavoro con:Paperclip: upload dall'URL con l'estensione

Ruby 1.9.3 
Rails 3.2.6 
paperclip 3.1.3 
aws-sdk 1.3.9 

ho il mio Modello Immagine:

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 

Quindi, in pratica ho fatto questo per scaricare il mio file da un URL:

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

Ma salvare il mio file con un file_name errato e non imposta l'estensione del file:

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

Come potete vedere non c'è un'estensione.

Ho trovato un metodo per risolverlo ma sono sicuro che posso avere un modo migliore. Questa soluzione è quella di copiare il file sul mio computer e poi mando su S3 in questo modo:

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 

Questo funziona sul mio 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" 

Tuttavia non so se questo metodo funzionerà su Heroku (ospito la mia app su di esso).

Non c'è un modo migliore senza passare da un file temporaneo?

risposta

22

Buon tempismo. Ho appena inviato una richiesta di estrazione che è stata riparata poche ore fa (20 luglio 2012) che dovrebbe rendere la vita facile.

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

Ciò Scarica la foto jpeg, assicurarsi che il nome del file è blah.jpg e il tipo di contenuto è 'immagine/jpg'

Paperclip versione> 3.1.3 (è necessario collegarlo github repo fino a quando non viene rilasciato).

UPDATE: confermato a lavorare con la versione graffetta> = 3.1.4

+2

Sei commettere funziona come un fascino! Ed è ora incluso in paperclip 3.1.4 È quello che volevo. Davvero un buon lavoro! Grazie! –

+2

Confermato, funziona alla grande con paperclip 3.1.4. Mi hai migliorato la giornata. Grazie! –