0

我正在按照本教程使用 Carrierwave 进行文件大小验证,并且它在大多数情况下都可以正常工作。

在我的模型中...

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

如果我要上传 5MB 的图片,我会收到错误Image is too big (should be at most 2 MB)。伟大的!问题是 5MB 文件保留在/uploads/tmp/. 显然,这可能会占用大量资源,如果文件太大,我不希望文件保存。

有任何想法吗?提前致谢。

编辑

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

4

2 回答 2

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 
于 2014-01-07T04:40:21.487 回答
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 }

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

于 2013-10-25T04:54:59.610 回答