ruby-Rails如何删除文件而不会失败

我正在使用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

安全删除此临时文件的最佳方法是什么? 谢谢

AnApprentice asked 2019-11-07T09:13:16Z
2个解决方案
115 votes

当您知道文件已完成时:

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(...)的文件...

severin answered 2019-11-07T09:13:55Z
29 votes

如果确定已完成操作,为什么不只使用FileUtils.rm_f(upload_path)或2603494266274055055169?

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唤醒并从temp目录中删除与这些临时文件匹配的一天之前的文件。 如果文件无法重新处理-您不会立即对其进行处理-并且没有在Rails的请求/响应循环上执行文件操作,那么这样做的好处是有一定的错误余地。

Andrew Kuklewicz answered 2019-11-07T09:14:40Z
translate from https://stackoverflow.com:/questions/12808988/rails-how-to-delete-a-file-without-failing-on-error