124 votes

Sauvegarde d'une image à partir d'un URL par un trombone

Veuillez me suggérer un moyen d'enregistrer une image à partir d'une URL avec le trombone.

201voto

Aditya Sanghi Points 7754

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 la méthode ci-dessus, vous obtiendrez un nom de fichier correct basé sur 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"

156voto

Nicolas Blanco Points 4815

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"

15voto

Ariejan Points 6567

Téléchargez d'abord l'image avec le curb à une pierre précieuse TempFile puis il suffit d'affecter l'objet tempfile et de sauvegarder votre modèle.

3voto

The Mini John Points 2544

Comme ces réponses sont anciennes, en voici une plus récente :

Ajoutez l'URL de l'image distante au contrôleur souhaité dans la base de données.

$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate

Modifiez 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

*En Rails4, vous devez ajouter l'attr_accessible dans le contrôleur.

Mettez à jour votre formulaire, si vous autorisez les autres à télécharger une image à partir d'une URL.

<%= f.input :image_remote_url, label: "Enter a URL" %>

2voto

Martin Streicher Points 476

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 fait juste un identifiant aléatoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X