web-dev-qa-db-fra.com

Comment puis-je télécharger un fichier à partir d'une URL et l'enregistrer dans Rails?

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é.)

185
Alok Swain

Essaye ça:

require 'open-uri'
open('image.png', 'wb') do |file|
  file << open('http://example.com/image.png').read
end
299
Levi

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]}")
128
Clemens Helm

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

28
superluminary

Je pense que c'est le moyen le plus clair:

require 'open-uri'

File.write 'image.png', open('http://example.com/image.png').read
10
Sage Ross

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.

8
Pär Wieslander