tips chips

日々の作業で出てきた技術メモの切れ端を置いておくページ

Rubyでバイナリファイルをダウンロードする

画像などをRubyスクリプト上からダウンロードする

require 'open-uri' URI.open('https://example.com/sample.jpg', 'rb') do |image| File.open('./image.jpg', 'wb') do |file| while (binary = image.read(256)) file.write(binary) end end end

wb rbといったbのついたモードを使うというのがポイント。 image.readとかやると全部メモリに載ってしまうのでreadで少しずつ取ってきて書き込み、ということをしている。

追記

上記のようにURI.openにstringリテラルを渡している場合は良いが、外部からの入力によってURLを組み立てているケースなどでは注意が必要とのこと。下記のRubocopルールに引っかかって知った。

Class: RuboCop::Cop::Security::Open — Documentation for rubocop (1.50.2)
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Security/Open

上記ページにも書いているが URI.parse(url).open('rb') do ...とするのが良い