8

しばらく前に、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 を消去できますか?

どうもありがとう。

4

4 に答える 4

2

Rails3が利用可能なときにx-sendfileを使用し、それを非アクティブ化する方法がないことを考えると、TempFileなどのライブラリでsend_fileを使用することはできません。最良のオプションは、質問で述べたものです。通常のファイルを使用し、古い一時ファイルを定期的に削除するcronタスクを使用します。

編集:未使用のファイルの削除は、メイドの宝石を扱うのが簡単になりました:

https://github.com/benjaminoakes/maid

于 2012-07-13T21:03:33.370 に答える
0

send_file をブロックに入れないでください。

f = Tempfile.new('prefix', "#{Rails.root}/tmp")
f.print('a temp message')
f.close
send_file(f.path, :x-sendfile => true)

次に、別のスクリプトを使用して一時ファイルをクリーンアップします

于 2011-05-18T12:04:24.373 に答える
0

file-temp gem はどうですか? https://github.com/djberg96/file-temp

require 'file/temp'

fh = File::Temp.new(false)
fh.puts "world"
fh.close # => Tempfile still on your filesystem

zzzhc の回答のように、クリーンアップを外部で管理する必要があります

于 2011-05-24T18:46:14.793 に答える