2012-10-09 8 views
31

私はJPEGCAMを使用して、ユーザーがウェブカメラでプロフィール写真を撮ることができます。これは、ように、一時ファイルをアップロード:エラーを起こさずにファイルを削除する方法を教えてください

def ajax_photo_upload  
    File.open(upload_path, 'w:ASCII-8BIT') do |f| 
    f.write request.raw_post 
    end 
    # @user.photo = File.open(upload_path) 
    @user.assign_attributes(
    :photo => File.open(upload_path), 
    :orig_filename => "#{current_user.full_name}.jpg" 
) 
    if @user.save 
    respond_to do |format| 
    ..... 
private 

    def upload_path # is used in upload and create 
    file_name = session[:session_id].to_s + '.jpg' 
    File.join(::Rails.root.to_s, 'public', 'temp', file_name) 
    end 

安全にこの一時ファイルの削除について移動する最良の方法は何ですか?ありがとう

答えて

19

あなたがそれを完了したと思われる場合は、FileUtils.rmまたはFileUtils.rm_fを使用しないでください。

FileUtils.rm_f(upload_path)

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm_f

また、Railsの中でこれを無視し、目を覚ますと、これらの一時ファイルに一致する一時ディレクトリから一日よりも古いファイルを削除するcronを持つことができます。これは、ファイルを再処理できない場合(すぐには使用できません)、ファイル操作がRailsの要求/応答ループで行われていない場合に、少し速く応答するため、エラーのためにいくらかのマージンが得られます。

72

あなたがファイルで行われていることを知っている:

File.delete(path_to_file) if File.exist?(path_to_file) 

もう一つは:/あなたはいつもあなたは、オペレーティングシステムを開いているファイルを閉じるだけで開いているファイルの特定の数を処理できることを確認してくださいファイルディスクリプタと、あなたがその制限を渡すとき、あなたはRubyでファイルを開きたいときに、常にどちらかのブロック形式を使用して...奇妙なバグに遭遇することがあります:

File.open(path) do |f| 
    # ... 
end 

とRubyが自動的にファイルを閉じます君は。ブロック形式が使用できない場合は、自分でファイルをクローズする必要があります。

f = File.open(path) 
# ... 
f.close 

ですから、@user.assign_attributes(...)に渡すファイルを閉じてください...

+0

レースコンディションに注意マルチスレッドやマルチでありますapp'ed ... – rogerdpack

関連する問題