J’ai une URL vers une image que je veux enregistrer localement, afin que je puisse utiliser Paperclip pour produire une miniature pour mon application. Quelle est la meilleure façon de télécharger et d’enregistrer l’image? (J’ai regardé dans le traitement des fichiers rbuy mais je n’ai rien trouvé.)
Essaye ça:
require 'open-uri' open('image.png', 'wb') do |file| file << open('http://example.com/image.png').read end
Une version encore plus courte:
require 'open-uri' download = open('http://example.com/image.png') IO.copy_stream(download, '~/image.png')
Pour conserver le même nom de fichier:
IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}")
Si vous utilisez PaperClip, le téléchargement depuis une URL est désormais géré automatiquement.
En supposant que vous avez quelque chose comme:
class MyModel < ActiveRecord::Base has_attached_file :image, ... end
Sur votre modèle, spécifiez simplement l'image en tant qu'URL, quelque chose comme ceci (écrit de manière délibérée):
@my_model = MyModel.new image_url = params[:image_url] @my_model.image = URI.parse(image_url)
Vous voudrez probablement mettre cela dans une méthode dans votre modèle. Cela fonctionnera également très bien sur le système de fichiers temporaire de Heroku.
Le trombone le prendra à partir de là.
source: documentation sur un trombone
Découvrez Net :: HTTP dans la bibliothèque standard. La documentation fournit plusieurs exemples sur la façon de télécharger des documents via HTTP.
Je pense que c’est la manière la plus claire:
require 'open-uri' File.write 'image.png', open('http://example.com/image.png').read