关于版本过程我不明白的事情......
我有一个 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
仅此而已,我就得到了两个 zip 副本。显然,我对版本/流程的工作原理有所了解,而且我无法找到真正解释其魔力的文档。
那么我该怎么做,我错过了什么?
最佳答案
这提供了“为什么”,尽管需要一些时间来理解: 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 - 最好避免 zip 的重复,但看起来您无法告诉 Carrierwave 跳过重复。
关于ruby-on-rails - Carrierwave 和 Zip 文件 : Using an extracted file as a version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14231416/