LoginSignup
15
10

More than 5 years have passed since last update.

Rack::TempfileReaper でファイルアップロード時にできたテンポラリファイルを即削除

Posted at

Rack は、ファイルアップロードなど、multipart なコンテントタイプのリクエストを処理するときに、送られてきたデータをテンポラリファイルとして保存する。

https://github.com/rack/rack/blob/1.6.4/lib/rack/multipart/parser.rb#L21-L22
https://github.com/rack/rack/blob/1.6.4/lib/rack/multipart/parser.rb#L135

ruby の Tempfile クラスを使ってテンポラリファイルを作っている。Tempfile は #close!(または #close(true))したらテンポラリファイルも削除するが、そうでないと GC されるかアプリケーションが終了するまで残り続けてしまう。

https://github.com/ruby/ruby/blob/v2_2_0/lib/tempfile.rb#L180-L183
https://github.com/ruby/ruby/blob/v2_2_0/lib/tempfile.rb#L131

すぐに close! してくれないかなー、と Rack を眺めていたら、Rack::TempfileReaper というものがあった。Eliminate dependency on garbage collection for cleanup of Tempfiles created by Rack for multipart form data という PR で入ったらしい。

config/application.rb あたりに config.middleware.use Rack::TempfileReaper と書いてこいつを使うようにしておけば、リクエストで使った Tempfile を close! してくれる。結果テンポラリファイルもすぐに消える :smile:

15
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10