Suggérez-moi un moyen d’enregistrer une image à partir d’une URL par Paperclip.
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
Alors simplement:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
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 d'ouvrir (url). Parce que avec open (url) vous allez obtenir "stringio.txt" comme nom de fichier. Avec ce qui précède, vous obtiendrez un nom correct pour le 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"
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
La version de mon trombone est 4.2.1
Avant l'ouverture, le type de contenu n'était pas correctement détecté, car ce n'était pas un fichier. Cela dirait image_content_type: "binary/octet-stream", et même si je le remplaçais avec le bon type de contenu, cela ne fonctionnerait pas.
Commencez par télécharger l’image contenant la gemme curb
dans un fichier TempFile
, puis assignez simplement l’objet tempfile et enregistrez votre modèle.
Cela peut vous être utile. Voici le code utilisant Paperclip et image présent dans une URL distante.
require 'rubygems'
require 'open-uri'
require 'Paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
En modèle
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Comme ce sont des réponses anciennes, voici une nouvelle:
Ajouter une URL d'image distante au contrôleur souhaité dans la base de données
$ Rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Éditez 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 le paramètre attr_accessible dans le contrôleur.
Mettez à jour votre formulaire, si vous autorisez une autre personne à télécharger une image à partir d'une URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
La documentation officielle est indiquée ici https://github.com/thoughtbot/Paperclip/wiki/Attachment-downloaded-from-a-URL
Quoi qu'il en soit, il ne semble pas avoir été 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 génère une erreur, en particulier cette erreur est générée:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
La nouvelle syntaxe correcte est la suivante:
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é avec la version Paperclip 5.3.0
et il fonctionne.
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 simplement un identifiant aléatoire.