web-dev-qa-db-fra.com

Enregistrer l'image de l'URL par un trombone

Suggérez-moi un moyen d’enregistrer une image à partir d’une URL par Paperclip.

118
khanh

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"
154
Nicolas Blanco

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"
193
Aditya Sanghi

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.

16

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.

15
Ariejan

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
3
prabu

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" %>
3
Mini John

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.

2
Diego D

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.

2
Martin Streicher