Подтвердить что ты не робот

Загрузка удаленного URL файла из Rails Console с помощью Carrierwave

Я просто хотел знать, как можно было бы загружать удаленный файл url с помощью Carrierwave в консоли Rails.

Я попробовал следующее без везения. Я предполагаю, что он не обрабатывает Uploader?

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

Большое спасибо

4b9b3361

Ответ 1

Взгляните на Загрузка файлов из удаленного расположения "на этой странице https://github.com/carrierwaveuploader/carrierwave

CarrierWave должен выдать ошибку, если URL-адрес местоположения недействителен

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

Или, если это неизвестный хост:

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

Также обратите внимание, что если вы хотите загружать удаленные изображения, вы должны префикс атрибута remote_ и суффикс его с помощью _url, как показано в примере

Ответ 2

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

FILE_LOCATION может быть

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

если файл находится в папке "файлы" в проекте rails

Ответ 3

У меня была та же проблема. и проблема может заключаться в том, что http перенаправляется на https. Поэтому я заменил их с помощью gsub следующим образом:

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

это, скорее всего, решит проблему.

Ответ 4

Работает как:

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

Ответ 5

У меня возникли проблемы с удаленным_avatar_url, не загружающим изображение или не вызывающим никаких ошибок. Для меня, насколько я могу судить, это потому, что я установил следующее в своей модели.

attr_accessor :remote_avatar_url

Carrierwave покрывает это для вас, и, хотя я не понимаю, почему, настраивая его на себя, все обманывает.