我没有得到关于版本过程的东西......
我有一个包含文件的zip文件,我想将该文件作为zip的“版本”上传:
者:
version :specificFile do
process :extract_file
end
def extract_file
file = nil
Zip::ZipFile.open(current_path) do |zip_file|
file = zip_file.select{|f| f.name.match(/specificFile/)}.first
zip_file.extract(file, "tmp/" + file.name.gsub("/", "-")){ true }
end
File.open("tmp/" + file.name.gsub("/", "-"))
end
用法:
=link_to "Specific File", instance.uploader.specificFile.url
这只是给我两个拉链副本。显然,关于版本/流程的工作方式,我有些遗漏,而且我无法找到真正解释魔术的文档。
那么我该怎么做呢,我错过了什么?
答案 0 :(得分:2)
这提供了“为什么”,虽然需要一点理解: How do you create a new file in a CarrierWave process?
换句话说,当您创建版本时,carrierwave会复制该文件,然后将该文件路径传递给该进程。当流程退出时,carrierwave将上传该路径的内容 - 而不是流程返回的文件,这就是我的想法。
工作代码:
version :specificFile do
process :extract_file
def full_filename (for_file = model.logo.file)
"SpecificFile.ext"
end
end
def extract_plist
file = nil
Zip::ZipFile.open(current_path) do |zip_file|
file = zip_file.select{|f| f.name.match(/specificFile/)}.first
zip_file.extract(file, "tmp/" + file.name.gsub("/", "-")){ true }
end
File.delete(current_path)
FileUtils.cp("tmp/" + file.name.gsub("/", "-"), current_path)
end
所以,为了做出我想要发生的事,发生,我:
告诉carrierwave使用特定的文件名。我使用的是硬编码值,但你应该能够使用你想要的任何东西。
使用版本名称下的内容覆盖current_path
的内容。在我的情况下,我不能在我“在其中”(我认为)时覆盖zip,所以我复制了我关心的文件并通过File和FileUtils覆盖了zip。
PS - 避免重复拉链会很好,但看起来你不能告诉carrierwave跳过重复。