しばらく前に、Rails アプリ内での一時ファイルの使用に関する質問を書きました。特定のケースでは、一時ファイルを使用することにしました
x-sendfile
これは、ディレクティブを ( Rails 2 のパラメーターとして、または Rails 3 の構成オプションとして)使用したい場合に問題を引き起こし、ファイル送信が Rails アプリではなく Web サーバーによって直接処理されるようにします。
そこで、次のようなことを考えました。
require 'tempfile'
def foo()
# creates a temporary file in tmp/
Tempfile.open('prefix', "#{Rails.root}/tmp") do |f|
f.print('a temp message')
f.flush
send_file(f.path, :x_sendfile => true) # send_file f.path in rails 3
end
end
このセットアップには 1 つの問題があります。ファイルは送信前に削除されます。
一方では、ブロックが終了するtempfile
とすぐにファイルを削除します。Tempfile.open
他方でx-sendfile
は、send_file 呼び出しを非同期にします。非常に迅速に返されるため、サーバーはファイルを送信する時間がほとんどありません。
現在考えられる最善の解決策は、非一時ファイル (Tempfile ではなくファイル) を使用し、一時フォルダーを定期的に消去する cron タスクを使用することです。以下の理由から、これは少し洗練されていません。
- 独自の一時ファイル命名スキームを使用する必要がある
- ファイルは、必要以上に長く tmp フォルダーに留まります。
より良いセットアップはありますか?または、非同期に少なくとも「成功」コールバックがあるsend_file
ので、完了したら f を消去できますか?
どうもありがとう。