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