使用Carrierwave一次存储两个版本的文件

时间:2014-08-12 11:48:43

标签: ruby-on-rails amazon-s3 carrierwave fog

我使用Carrierwave和Fog gems将文件存储到我的Amazon S3存储桶(到/files/file_id.txt)。我需要同时将文件的略微不同版本存储到存储桶中的不同位置(/files/file_id_processed.txt)(存储原始文件后)。我不想在模型上为它创建单独的上传者属性 - 还有其他方法吗?

这是我当前存储文件的方法:

def store_file(document)
  file_name = "tmp/#{document.id}.txt"

  File.open(file_name, 'w') do |f|
    document_content = document.content
    f.puts document_content
    document.raw_export.store!(f)
    document.save
  end

  # I need to store the document.processed_content

  File.delete(file_name) if File.exist?(file_name)
end

这是文档模型:

class Document < ActiveRecord::Base
  mount_uploader :raw_export, DocumentUploader
  # here I want to avoid adding something like:
  # mount_uploader :processed_export, DocumentUploader
end

这是我的Uploader类:

class DocumentUploader < CarrierWave::Uploader::Base

  storage :fog

  def store_dir
    "files/"
  end

  def extension_white_list
    %w(txt)
  end
end

2 个答案:

答案 0 :(得分:1)

这是我最终解决方案的样子(有点) - 基于Nitin Verma的回答:

我必须为Uploader类添加一个自定义处理器方法:

# in document_uploader.rb

...

version :processed do
  process :do_the_replacements
end

def do_the_replacements
  original_content = @file.read
  File.open(current_path, 'w') do |f|
    f.puts original_content.gsub('Apples','Pears')
  end
end

答案 1 :(得分:0)

考虑到您需要类似的文件,但名称不同。 为此,您需要在上传器中为文件创建一个版本。

version :processed do
  process
end

现在第二个文件名将被处理_ {origional_file} .extension。如果您想更改第二个文件的文件名,可以使用此链接https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names