12

私は、Ubuntu上で動作するRails 3.0.3アプリケーションで画像のアップロードを処理するためにPaperclip(2.3)を使用しています。 Paperclipは広告されているアップロードを処理していますが、アプリケーションの/ tmpフォルダに作成されたRackMultipart *ファイルは保持されます。つまり、削除するのではなく単に蓄積するだけです。私は古いtmpファイルを削除するためにtmpreaperを使うことができることを認識していますが、もっとエレガントでスケーラブルな解決策を探したいと思います。Rack/tmpディレクトリにRackMultipart *ファイルが永続化されているのはなぜですか?

以前の問題(RackMultipart *ファイル)がRailsアプリのルートディレクトリ(/ tmpではなく)に蓄積されていました。私は明示的にそうように私environment.rbのファイルに一時パスを設定することで、これを解決:

ENV['TMPDIR'] = Rails.root.join('tmp') 

一時ファイルが適切に処理されていることを確認するように設定する必要があり、別の環境変数があります - すなわち、彼らいったん削除しますモデルに保存されましたか?これがPaperclipやRailsの設定に問題があるかどうかはわかりません。

私は高低を検索しましたが、これについて少し進歩していません。私はどんなリードにも感謝しています。

誠にありがとうございます。

PS - 私は現在、ストレージ用にS3を使用しています。これは問題に結びついているようではありません。ファイルをローカルに保管していたときも同じ問題がありました。

+0

:application.rbでこのラインを含む

http://www.rubydoc.info/github/rack/rack/Rack/TempfileReaper

問題を解決します。 CRONは10分ごとにtmpreaperを実行してtmpディレクトリをクリアします。まだエレガントな修正が欲しいですが、これは今のところうまくいくようです。 – NAD

+0

あなたはどのサーバーを使用していますか?おそらくプーマ? –

+0

Rack develグループの関連スレッド:https://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ –

答えて

5

これはもうエレガントであれば、私は知らないが、これは、ファイルが

tempfile = params[:file].tempfile.path 
if File::exists?(tempfile) 
    File::delete(tempfile) 
end 
+1

私は2つの同じ*一時的なものを見ていますファイルを作成すると、上記のうちの1つだけが削除されます(https://github.com/rack/rack/issues/641) –

0

UPDATE「に保存された後に私がやっているものです:。問題は、ラック1.6.0.beta2で解決しなければならないIそれはすでにRailsの4.2.0.rc2に使われている参照の回避策は以下

ほぼ一年のためによく私を務め:。

私はファイルのアップロードを受け入れるコントローラのアクションの最後にこれを追加しました

Thread.new { GC.start } 

これは、使用されていないRack :: Requestオブジェクトのガベージコレクションを起動し、関連する一時ファイルも削除します。これは、現在の要求の一時ファイルを掃引しませんが、以前のファイルは削除され、累積されません。

9

TempFileReaperは、この問題を処理するためのRackミドルウェアです。今、私はcronとtmpreaperを使用して一時ファイルの問題を処理していますについて

config.middleware.use Rack::TempfileReaper 
+1

私の人生を救いました。 –

+1

これは正解です。これらの一時ファイルはRackのドメインです(ファイル名から明らかです)。これは、Paperclipを使用するときだけでなく、フォームのマルチパートアップロードでも発生します。 TempfileReaperミドルウェアは1.6.0ではRackに追加されましたが、Railsではデフォルトとして有効になっていないようです。 – CMcClymont

関連する問題