67

私は JPEGCAM を使用して、ユーザーが Web カメラでプロフィール写真を撮れるようにしています。これにより、次のように一時ファイルがアップロードされます。

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

この一時ファイルを安全に削除するにはどうすればよいですか? ありがとう

4

2 に答える 2

137

ファイルが完成したことがわかったら、次のようにします。

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

もう1つのこと:開いたファイルを常に閉じるようにしてください。オペレーティングシステムは特定の数の開いているファイル/ファイル記述子しか処理できず、その制限を超えると奇妙なバグに遭遇する可能性があります... Rubyでファイルを開きたい場合は、常にブロック形式を使用してください。

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

そしてRubyはあなたのためにファイルを自動的に閉じます。ブロックフォームが使用できない場合は、自分でファイルを閉じる必要があります。

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

したがって、渡すファイルを必ず閉じてください@user.assign_attributes(...)...

于 2012-10-10T08:14:41.293 に答える
34

あなたがそれで終わっていると確信しているなら、なぜ単にまたはを使用しないのですFileUtils.rmFileUtils.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でこれを無視して、これらの一時ファイルと一致する一時ディレクトリから1日より古いファイルを起動して削除するcronを作成することもできます。これには、ファイルの再処理に失敗した場合にエラーが発生する可能性があるという利点があります(すぐにrmしないでください)。また、Railsの要求/応答ループでファイル操作が実行されないため、応答が少し速くなります。

于 2012-10-09T22:06:56.160 に答える