验证失败时,CarrierWave文件大小验证器将映像保留在/ tmp /目录中

时间:2013-10-24 21:58:37

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

我正在关注这个tutorial for file size validation with Carrierwave,它在大多数情况下都应该正常工作。

在我的模特中......

validates :image, :file_size => { :maximum => 2.megabytes.to_i }

如果我上传5MB图片,我会收到错误图片太大(应该最多2 MB)。大!问题是/uploads/tmp/中有5MB文件。显然,这可能会变得非常耗费资源,如果文件太大,我不希望文件保存。

有什么想法吗?提前谢谢。

修改

我正在使用Heroku并认为它可能与缓存和形式重新显示有关。见here。我想换句话说我要做的是禁用图像的重新显示?因为图像确实显示(未处理并来自/uploads/tmp/目录)。虽然如果我重新加载页面(不重新提交表单),图像将从表单中消失,但文件仍保留在/tmp目录中。希望这是有道理的。

2 个答案:

答案 0 :(得分:2)

我也有同样的问题,并使用@labocho提供的解决方案,但在那之后,carrierwave的重新显示不再起作用了。因此,我在我的控制器中创建了一个函数来检查和删除旧的图像缓存文件夹,并将其用作表单处理操作的before_filter函数。到目前为止没有问题。我的代码是这样的:

class ImagesController < ApplicationController
  before_action :remove_old_cache, only: [:create]

  # Handle image creation
  def create
    ...
  end

  # Delete tmp image directory if validation fails (for carrier wave)  
  def remove_old_cache
    image = params[:image]
    if image[:image] && !image[:image_cache].empty?
      cache_name = image[:image_cache]
      # get the cache directory
      cache_dir = cache_name.split('/')[0]
      FileUtils.rm_rf(File.join("#{Rails.root}", "/public/uploads/tmp/", cache_dir))
    end
  end
  ...
end 

答案 1 :(得分:1)

验证失败时,您可以按#remove!删除文件。

# lib/file_size_validator.rb
def validate_each(record, attribute, value)
  ...
  CHECKS.each do |key, validity_check|
     ...
    record.errors.add(attribute, MESSAGES[key], errors_options)
    if options[:remove_if_invalid]
      # Remove cached file
      value.remove!
    end
  end
end

# in model source
validates :image, :file_size => { :maximum => 2.megabytes.to_i, :remove_if_invalid => true }

如果您在验证期间不喜欢破坏性操作,可以稍后设置标记并删除文件。