2

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

我有一个 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 副本。显然,关于版本/流程的工作方式,我缺少一些东西,而且我无法找到真正解释魔法的文档。

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

4

1 回答 1

2

这提供了“为什么”,尽管需要一点时间才能理解: 如何在 CarrierWave 进程中创建新文件?

换句话说,当您创建一个版本时,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 跳过重复。

于 2013-01-09T09:24:48.467 回答