J'ai une URL vers une image que je veux enregistrer localement, afin de pouvoir utiliser Paperclip pour produire une vignette pour mon application. Quel est le meilleur moyen de télécharger et d'enregistrer l'image? (J'ai examiné la gestion du fichier Ruby 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 maintenant géré automatiquement.
En supposant que vous ayez 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 à la main 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 de votre modèle. Cela fonctionnera également parfaitement sur le système de fichiers temporaire de Heroku.
Un trombone partira de là.
source: documentation du trombone
Je pense que c'est le moyen le plus clair:
require 'open-uri'
File.write 'image.png', open('http://example.com/image.png').read
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.