Rubyで一時的なファイルが使いたいときはTempfileライブラリが使えます。画像をダウンロードして一時的にファイルとして保存したい場合などに便利です。使い方をメモします。
リファレンスはhttps://docs.ruby-lang.org/ja/2.3.0/class/Tempfile.htmlです。
準備
Tempfileを使うにはrequireします。
require 'tempfile'
作成する
openメソッドを使います。モードはデフォルトでは”w+”です。Tempfileオブジェクトが返ります。使い終わったらunlinkで削除します。
t = Tempfile.open t.unlink
openメソッドにブロックを渡すと、ブロックを抜けると自動的にクローズされます。
Tempfile.open { |t|
}
情報を取得する
作成したTempfileの情報を取得してみます。
パスを取得する
pathメソッドでパスが取得できます。
Tempfile.open { |t|
p t.path
}
サイズを取得する
sizeもしくはlengthメソッドでパスが取得できます。
Tempfile.open { |t|
p t.size
}
書き込む
writeメソッドを使います。
Tempfile.open { |t|
t.write "hello world!"
}
バイナリデータを書き込む
画像などのバイナリデータを書き込むときは、IO.binmodeでバイナリモードにします。
Tempfile.open { |t|
t.binmode
t.write 画像データ
}
例)画像をダウンロードして書き込む
OpenURIを使ってダウンロードした画像をTempfileに書いてみます。(URLは仮想です。)
require 'open-uri'
require 'tempfile'
open("http://example.com/foo.jpg") { |o|
Tempfile.open { |t|
t.binmode
t.write o.read
p "パスは#{t.path}です。"
p "サイズは#{t.size}バイトです。"
}
}
実行すると、こんな感じです。
"パスは/tmp/20160925-12298-dxs9mvです。" "サイズは137428バイトです。"
binmodeを指定していないと、エラーがでます。
#<Encoding::UndefinedConversionError: "\xFF" from ASCII-8BIT to UTF-8>
読み込む
書いた内容を読むにはFile.readなどのFileライブラリの読み込み系のメソッドを使います。
下の例ではopenでファイルを開き直して、ファイルポインタを先頭にリセットしています。
Tempfile.open { |t|
t.write "hello world!"
t.open
p t.read
}
実行すると、こんな感じです。
"hello world!"