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!"