Carrierwave& Zipfiles:使用提取的文件作为版本

时间:2013-01-09 08:54:16

标签: ruby-on-rails zip carrierwave

我没有得到关于版本过程的东西......

我有一个包含文件的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

这只是给我两个拉链副本。显然,关于版本/流程的工作方式,我有些遗漏,而且我无法找到真正解释魔术的文档。

那么我该怎么做呢,我错过了什么?

1 个答案:

答案 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。

    < / LI>

PS - 避免重复拉链会很好,但看起来你不能告诉carrierwave跳过重复。