回答:
これを試して:
require 'open-uri'
open('image.png', 'wb') do |file|
file << open('http://example.com/image.png').read
end
IO.copy_stream(open('http://example.com/image.png'), 'destination.png')
require 'open-uri'
さらに短いバージョン:
require 'open-uri'
download = open('http://example.com/image.png')
IO.copy_stream(download, '~/image.png')
同じファイル名を保持するには:
IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}")
PaperClipを使用している場合、URLからのダウンロードが自動的に処理されるようになりました。
あなたが次のようなものを持っていると仮定します:
class MyModel < ActiveRecord::Base
has_attached_file :image, ...
end
モデルでは、次のように画像をURLとして指定するだけです(意図的に長めに記述します)。
@my_model = MyModel.new
image_url = params[:image_url]
@my_model.image = URI.parse(image_url)
これをモデルのメソッドに配置することをお勧めします。これはHerokuの一時ファイルシステムでも問題なく機能します。
ペーパークリップはそこからそれを取ります。
ソース:ペーパークリップのドキュメント
標準ライブラリのNet :: HTTPを確認してください。ドキュメントには、HTTPを使用してドキュメントをダウンロードする方法の例がいくつか記載されています。
Kernel#open
ファイルアクセスだけでなく、パイプシンボルの接頭辞(などopen("| ls")
)によるプロセス呼び出しも可能にするため、より多くの可視性が必要です。したがって、の引数に変数入力を使用することにより、深刻なセキュリティリスクにつながる可能性がありKernel#open
ます。