ruby-on-rails - Carrierwave 和 Zip 文件 : Using an extracted file as a version

标签 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

仅此而已,我就得到了两个 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/

相关文章:

android - 创建项目 Android 时出错

ruby-on-rails - 从 s3 carrierwave rails heroku 下载文件夹为 zip

html - Rails/Carrierwave 缩略图调整大小无法正常工作

ruby-on-rails - 如何让 Rails 获得急切的加载计数?

css - rails : Upload images and align as a gallery

ruby-on-rails - 将 Rails 应用程序推送到 heroku 给我错误:错误:0308010C:数字信封例程::不受支持

c# - 如何将文件添加到现有的 zip 存档

ruby-on-rails - capybara 选择多个单选按钮

ios - Objective-Zip 无法打开 Zip

mongoid - 无法将 ActionDispatch::Http::UploadedFile 类的对象序列化为 BSON