【问题标题】:Rails how to delete a file without failing on errorRails如何删除文件而不会因错误而失败
【发布时间】:2012-10-09 21:53:56
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    当您知道文件已完成时:

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

    【讨论】:

      【解决方案2】:

      如果你确定你已经完成了,为什么不直接使用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 中忽略这一点,并让一个 cron 唤醒并从临时目录中删除与这些临时文件匹配的一天之前的文件。如果文件无法重新处理 - 您不会立即 rm 它 - 并且文件操作不是在 Rails 的请求/响应循环上完成的,那么这有一些错误余地的好处,这样会更快地响应。

      【讨论】:

      • 这应该是公认的答案,至少对于标题中的问题。
      猜你喜欢
      • 2012-08-09
      • 2023-03-17
      • 2022-11-29
      • 2014-10-24
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多