Ruby Tempfileの使い方

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