Réponses:
Voici un moyen simple:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
Puis simplement:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. C'est probablement bien dans la plupart des situations.
open(url)
, le nom de fichier n'est pas précis, par exemple open-uri20150106-10034-lpd5fm.
au lieu de ef3a601e_ef3d008b_ef3d0f7e.jpg
.
Dans Paperclip 3.1.4, c'est devenu encore plus simple.
def picture_from_url(url)
self.picture = URI.parse(url)
end
C'est légèrement mieux que open (url). Parce qu'avec open (url), vous obtiendrez "stringio.txt" comme nom de fichier. Avec ce qui précède, vous obtiendrez un nom correct du fichier en fonction de l'URL. c'est à dire
self.picture = URI.parse("http://something.com/blah/avatar.png")
self.picture_file_name # => "avatar.png"
self.picture_content_type # => "image/png"
application/octet_stream
comme content_type
.
Cela n'a pas fonctionné pour moi jusqu'à ce que j'utilise "open" pour l'URI analysé. une fois que j'ai ajouté "ouvert", cela a fonctionné!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
Ma version trombone est la 4.2.1
Avant de l'ouvrir, il ne détectait pas le type de contenu correctement, car ce n'était pas un fichier. Il dirait image_content_type: "binary / octet-stream", et même si je le remplace avec le bon type de contenu, cela ne fonctionnerait pas.
Commencez par télécharger l'image avec la curb
gemme dans a TempFile
, puis attribuez simplement l'objet tempfile et enregistrez votre modèle.
Cela peut vous être utile. Voici le code utilisant un trombone et une image présente dans l'URL distante.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
Dans le modèle
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Comme ce sont des anciennes réponses, voici une nouvelle:
Ajouter l'URL d'image distante à votre contrôleur souhaité dans la base de données
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Modifier votre modèle
attr_accessible :description, :image, :image_remote_url
.
.
.
def image_remote_url=(url_value)
self.image = URI.parse(url_value) unless url_value.blank?
super
end
* Dans Rails4, vous devez ajouter l'attr_accessible dans le contrôleur.
Mettez à jour votre formulaire si vous autorisez d'autres personnes à télécharger une image à partir d'une URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
?
super
est utilisée pour invoquer la méthode d'origine, la recherche du corps de la méthode commence dans la super classe de l'objet qui contient la méthode d'origine
C'est une méthode hardcore:
original_url = url.gsub(/\?.*$/, '')
filename = original_url.gsub(/^.*\//, '')
extension = File.extname(filename)
temp_images = Magick::Image.from_blob open(url).read
temp_images[0].write(url = "/tmp/#{Uuid.uuid}#{extension}")
self.file = File.open(url)
où Uuid.uuid crée juste un identifiant aléatoire.
La documentation officielle est rapportée ici https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
Quoi qu'il en soit, il ne semble pas mis à jour, car dans la dernière version de paperclip quelque chose a changé et cette ligne de code n'est plus valide:
user.picture = URI.parse(url)
Cela soulève une erreur, en particulier cette erreur est déclenchée:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
La nouvelle syntaxe correcte est celle-ci:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Nous devons également ajouter ces lignes dans le fichier config / initializers / paperclip.rb :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Testé cela avec la version trombone 5.3.0
et cela fonctionne.
update_attributes
renommerpicture_from_url
enpicture_url=(value)
par exemple.