如何使用carrierwave的from_version来引用已处理的基本图像,而不是未经处理的基本图像

时间:2017-09-24 09:40:25

标签: carrierwave

我正在一个需要有简报的简报页面的网站上工作。 PDF存储在不同的站点上,但该站点没有缩略图,因此我必须自己生成它们并将缩略图链接到该站点。

我无法存储原始PDF - 链接版本是规范的,并且具有过时的缓存版本是不可接受的。额外的存储使用量也可能导致该网站所针对的非营利组织每月额外支出,因此我不想在不需要时将这些费用留在周围。

我有以下代码:

class DocumentUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def content_type_whitelist
    'application/pdf'
  end

  def full_filename(for_file)
    parent_name = super(for_file)
    return unless parent_name
    extension = '.pdf'
    base_name = parent_name.chomp(extension)
    if version_name
      base_name = base_name[version_name.size.succ..-1]
    end
    [base_name, version_name].compact.join("_") + '.png'
  end

  # Process files as they are uploaded:
  process convert_pdf_front: [500, 500]

  version :medium do
    process convert_pdf_front: [160, 160]
  end

  version :small do
    process convert_pdf_front: [80, 80]
  end

  private

  def convert_pdf_front(width, height)
    manipulate! do |img|
      img.format('png') do |c|
        c.resize "#{width}x#{height}"
      end
      img
    end
  end
end

这可以按预期工作,但是中小版本是从原始PDF转换而来的,这是一个相当缓慢的过程。

如果我用以下代码替换处理代码:

  version :full do
    process convert_pdf_front: [500, 500]
  end

  version :medium, from_version: :full do
    process convert: 'png'
    process resize_to_fit: [160, 160]
  end

  version :small, from_version: :full do
    process convert: 'png'
    process resize_to_fit: [80, 80]
  end

然后从完整版本转换中小版本,但原始PDF仍然存在。

有没有办法使用from_version从转换后的原始文档进行转换 - 也就是说,从500x500 PNG而不是PDF - 这不会让原始PDF混乱到位?在通过任何process命令后,是否有特殊版本名称指向原始文档,而不是之前?

(我宁愿不再简单地使用收割机来处理PDF文件,因为Carrierwave认为这些是原件。我希望Carrierwave在所有情况下都将500x500 PNG视为原件,并且一旦完成就不会存储PDF转换过程。)

0 个答案:

没有答案