Jak mogę pobrać plik z adresu URL i zapisać go w Rails?

Mam adres URL do obrazu, który chcę zapisać lokalnie, dzięki czemu mogę użyć Paperclip do stworzenia miniatury dla mojej aplikacji. Jaki jest najlepszy sposób na pobranie i zapisanie obrazu? (Zajrzałem do obsługi plików ruby, ale na nic się nie natknąłem.)

Author: Yarin, 2010-03-25

6 answers

Spróbuj tego:

require 'open-uri'
open('image.png', 'wb') do |file|
  file << open('http://example.com/image.png').read
end
 324
Author: Levi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-22 16:18:33

Jeszcze krótsza wersja:

require 'open-uri'
download = open('http://example.com/image.png')
IO.copy_stream(download, '~/image.png')

Aby zachować tę samą nazwę pliku:

IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}")
 160
Author: Clemens Helm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 00:00:24

Jeśli używasz PaperClip, pobieranie z adresu URL jest teraz obsługiwane automatycznie.

Zakładając, że masz coś takiego:

class MyModel < ActiveRecord::Base
  has_attached_file :image, ...
end

Na twoim modelu wystarczy podać obrazek jako adres URL, coś w tym stylu (napisane celowo długopisem):

@my_model = MyModel.new
image_url = params[:image_url]
@my_model.image = URI.parse(image_url)
Prawdopodobnie będziesz chciał umieścić to w metodzie w swoim modelu. Będzie to również działać dobrze na tymczasowym systemie plików Heroku.

Spinacz zajmie się tym.

Źródło: spinacz dokumentacja

 30
Author: superluminary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-30 09:58:46

Myślę, że to jest najczystszy sposób:

require 'open-uri'

File.write 'image.png', open('http://example.com/image.png').read
 15
Author: Sage Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-01 20:12:58

Sprawdź Net:: HTTP w bibliotece standardowej. Dokumentacja zawiera kilka przykładów pobierania dokumentów za pomocą protokołu HTTP.

 11
Author: Pär Wieslander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 13:42:17

Oto prawdopodobnie najprostszy sposób:

IO.copy_stream(URI.open("https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png"), 'destination.png')
 1
Author: stevec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-19 14:18:09