web-dev-qa-db-fra.com

Téléchargement d'une URL de fichier distant depuis Rails Console avec Carrierwave

Je voulais juste savoir comment on pourrait télécharger une URL de fichier distant en utilisant Carrierwave dans la console Rails.

J'ai essayé ce qui suit sans aucune chance. Je suppose qu'il ne traite pas l'uploader?

user = User.first
user.remote_avatar_url = "http://www.image.com/file.jpg"
user.save

Merci beaucoup

34
Wasabi Developer

Jetez un œil à la section ' Téléchargement de fichiers à partir d'un emplacement distant ' sur cette page https://github.com/carrierwaveuploader/carrierwave

CarrierWave devrait générer une erreur si l'URL de l'emplacement n'est pas valide

2.1.3 :015 > image.remote_image_url = "http"
 => "http"
2.1.3 :016 > image.save!
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image trying to download a file which is not served over HTTP

Ou s'il s'agit d'un hôte inconnu:

2.1.3 :017 > image.remote_image_url = "http://foobar"
=> "http://foobar"
2.1.3 :018 > image.save!
   (0.4ms)  BEGIN
   (0.4ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image could not download file: getaddrinfo: nodename nor servname provided, or not known

Veuillez également noter que si vous souhaitez télécharger des images distantes, vous devez préfixer l'attribut avec remote_ et suffixez-le avec _url, comme illustré dans l'exemple

20
Koos Rompestomper
user = User.first
user.remote_avatar = File.open(FILE_LOCATION)
user.save

FILE_LOCATION peut être

File.join(Rails.root, '/files/png-sample.png')

si le fichier est trouvé dans un dossier 'files' dans Rails project

6
Oss

J'étais confronté au même problème. et le problème pourrait être http redirige vers https. Je les ai donc remplacés en utilisant gsub comme suit:

image.remote_image_url = remote_image_url.gsub('http://','https://')
image.save!

cela devrait probablement résoudre le problème.

5
Subhash Chandra

Est-ce que le travail est:

url='http://Host.domain/file.jpg'    
time=Time.now.to_i.to_s
myfile=IO.sysopen("tmp/"+time+"_img."+url.split(".").last,"wb+")
tmp_img=IO.new(myfile,"wb")
tmp_img.write open(URI.encode(url)).read

if File.exist?("tmp/"+time+"_img."+url.split(".").last)
  "tmp/"+time+"_img."+url.split(".").last
  image = ActionDispatch::Http::UploadedFile.new(:tempfile => tmp_img, :filename => File.basename(tmp_img))
else 
  image=nil
end
@your_model.image=image
@your_model.save

J'ai rencontré des problèmes avec remote_avatar_url ne téléchargeant pas l'image ou ne générant aucune erreur. Pour moi, pour autant que je sache, c'est parce que j'ai défini ce qui suit dans mon modèle.

attr_accessor :remote_avatar_url

Carrierwave couvre cela pour vous, et bien que je ne comprenne pas pourquoi, le configurer vous-même embête les choses.

0
hellion