URLからファイルをダウンロードしてRailsに保存するにはどうすればよいですか?


197

ローカルに保存したい画像へのURLがあるので、ペーパークリップを使用してアプリケーションのサムネイルを作成できます。画像をダウンロードして保存する最良の方法は何ですか?(私はrubyファイルの処理を調べましたが、何も見つかりませんでした。)

回答:


315

これを試して:

require 'open-uri'
open('image.png', 'wb') do |file|
  file << open('http://example.com/image.png').read
end

1
これは機能します。ありがとう。画像で試してみました。画像がファイルに正しく書き込まれていません。まるで破損しているかのようです。また、これをRailsアプリケーションで同じように行うように案内してくれませんか。これをRailsアプリケーションで使用できますか?
Alok Swain、

はい、railsアプリケーションで使用できます。ファイルが正しく書き込まれていないのは、おそらく書き込みバイナリモードで宛先を開くのを忘れたためです。それを編集します。
Levi

78
これにより、メモリ内のファイル全体が読み込まれます。最善の方法はIO.copy_stream(open('http://example.com/image.png'), 'destination.png')
janko-m 2015

3
rails require 'open-uri'
5、2016

1
この答えは私にはうまくいきませんでした。正解はこちら:stackoverflow.com/a/29743394/1536309
Blair Anderson

147

さらに短いバージョン:

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]}")

2
出力は文字列としてメモリに保存されないため、より効率的です。+1
Itay Grudev

2
両方の答えを表示することは実際には便利ですが、私のような人々は両方を見ることができ、違いを考えてから、正しい理由で意識的にこの答えを選択します:)
Maxwell Evans

30

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の一時ファイルシステムでも問題なく機能します。

ペーパークリップはそこからそれを取ります。

ソース:ペーパークリップのドキュメント


4
今後の検索では、Paperclipはデフォルトでこれを許可しなくなりました。medium.com
weeds

14

私はこれが最も明確な方法だと思います:

require 'open-uri'

File.write 'image.png', open('http://example.com/image.png').read

sage私は
Railsの初心者

1
状況によって異なりますが、通常は、モデルまたはコントローラーメソッド内でこのようなことを行います。Railsのコンテキストでは、ディスクに直接書き込むよりも、ActiveStorageなどのフレームワークのツールを使用する方がよいでしょう。
セージ・ロス

10

標準ライブラリのNet :: HTTPを確認してください。ドキュメントには、HTTPを使用してドキュメントをダウンロードする方法の例がいくつか記載されています。


2
この回答では、Kernel#openファイルアクセスだけでなく、パイプシンボルの接頭辞(などopen("| ls"))によるプロセス呼び出しも可能にするため、より多くの可視性が必要です。したがって、の引数に変数入力を使用することにより、深刻なセキュリティリスクにつながる可能性がありKernel#openます。
ConorB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.