2011-12-20 5 views
7

Rails 3.1のファイルアップロードにCarrierWaveを使用しています。サーバースペースを節約する方法を探しています。アップロードされる写真の多くは20MB以上ですので、1024×1024まで処理した後、元の写真を削除したいと思います。アップローダークラスでこれを行う簡単な方法はありますか?バージョンの処理後にcarrierwaveに元のファイルを保存させないようにするにはどうすればよいですか?

おかげで、 --mark

+0

はあなたのための私の解決策の仕事をしたのか? – Lichtamberg

答えて

3

あなたはあなたの中にafter_saveコールバックを定義することができ、写真をモデル化し、削除します。..

私はあなたがそれをカスタマイズしている場合、このようなモデルが、何かが動作する可能性を知らない:

class User << ActiveRecord::Base 

    after_create :convert_file 
    after_create :delete_original_file 

    def convert_file 
    # do the things you have to do 
    end 

    def delete_original_file 
    File.delete self.original_file_path if File.exists? self.original_file_path 
    end 
end 
+0

あなたはいくつかの実用的な例を提供できますか? –

+0

例を追加 – Lichtamberg

+0

あなたの功績はありましたか?はいの場合は、正しい答えをマークするといいと思います。 – Lichtamberg

1
class FileUploader < CarrierWave::Uploader::Base 

    after :store, :delete_original_file 

    def delete_original_file(new_file) 
    File.delete path if version_name.blank? 
    end 

    include CarrierWave::RMagick 

    storage :file 
    . 
    . # other configurations 

end 
22

私は2つのバージョンを持っていたと私は、元

01を必要としないしなかったことを実現ノーマルと今、元は私が必要とするサイズで保存されます。この

process :resize_to_limit => [300, 300] 

を追加し、私は、サーバー

上の第三未使用のイメージを持っていない:

ので、代わりに

version :thumb do 
    process :resize_to_limit => [50, 50] 
    end 

version :normal do 
    process :resize_to_limit => [300,300] 
end 

を有していると私は削除しました

+1

素晴らしいですが、これはどのバージョンブロックの外でもプロセスを実行するのに最適なソリューションだと思うので、オリジナルのバージョンを保存しないようにしてください。ありがとう – FireDragon

+1

'version'ブロックで起こるようにアップロードされたファイルのファイル名に' 'normal_" 'を含めたければ、ベースアップローダにバージョン名を明示的に割り当てることができます'version_names <<:medium'です。 –

7

みんな! 選択した解決策は私のためには機能しません。 私の解決策:

after :store, :remove_original_file 

    def remove_original_file(p) 
    if self.version_name.nil? 
     self.file.delete if self.file.exists? 
    end 
    end 
+1

ありがとう、あなたはクッキーに値する! –

0

それは少しハックですが、パフォーマンス上の利点

my_uploader.send :store_versions!, open(my_file) 
関連する問題