我使用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
答案 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