Carrierwave和Jcrop,删除原作后的作品?

时间:2015-05-25 19:57:44

标签: ruby-on-rails carrierwave jcrop

在制作裁剪版本后,我很难让Carrierwave删除原始文件。我正在制作一个600像素的上传版本供用户裁剪但是裁剪之后我希望该版本被删除,因为它从未在网站上使用过。

我尝试过在网上找到的几个解决方案,但他们都在裁剪之前删除了大版本,而不是之后。

这是我的Carrierwave上传器:

{{1}}

2 个答案:

答案 0 :(得分:1)

您可以使用after_store回调删除原始文件(使用File.delete),也可以修改原始文件,使其成为您需要的最大尺寸:

version :normal do
   process :resize_to_limit => [600,600]
end

答案 1 :(得分:0)

对于那些试图为图像名称添加一些修订信息(例如裁剪)的情况来解决问题的人,我找到了一种方法来做到这一点。

# :large is the cropped version
version :small_square, from_version: :large do 
  before :cache, :reset_revision
  after :store, :remove_old_revision

  def full_filename(for_file)
    fname = super(for_file)
    "#{ fname.pathmap('%n') }_#{ model.image_revision }#{ fname.pathmap('%x') }"
  end

  def full_original_filename
    "#{ super.pathmap('%n') }_#{ model.image_revision }#{ super.pathmap('%x') }"
  end

  def remove_old_revision(file = nil)
    File.delete(@old_path) if @old_path && File.exists?(@old_path)
  end

  def reset_revision(file = nil)
    # Otherwise we'll get `cannot update new record` error
    if model.persisted?
      # Creating an instance variable that will be used after storing the cropped version
      @old_path = File.join(Rails.public_path, model.public_send(mounted_as).store_dir, full_original_filename)

      # I use :image_revision column in the DB
      model.update_columns(image_revision: SecureRandom::hex(8))
    else
      model.image_revision = SecureRandom::hex(8)
    end
  end

  process :crop_small_square
end

因此,在更改生成的图像名称然后删除第一个版本之前,它会存储裁剪版本的第一个版本的路径。

花了一些时间来弄清楚如何将一些abracadabra附加到文件的确定版本的末尾:它采取更新操作,而不仅仅是分配属性。 Carrierwave的文档并不准确。