如何在CarrierWave过程中创建新文件?

时间:2011-02-11 10:38:06

标签: ruby-on-rails process carrierwave

我的用户上传了一个包含3个文件(A.ttf,A.svg,A.otf)的zip文件,我想将原始zip和3个字体文件存储在其中。我用这段代码创建了3个版本

version :ttf
    process :font => :ttf
end

version :svg
    process :font => :svg
end

version :otf
    process :font => :otf
end

它成功保存了原始文件的4个副本,所有副本都具有正确的文件名。但是,我不知道如何让CarrierWave存储单个文件。此代码不起作用。 :(

def font(format)
  new_file = nil

  # Loop through the zip file and extract the files
  Zip::ZipFile.open(@file.file) do |files|
    files.each do |f|
      next unless f.file?

      filename  = f.name.split("/").last
      ext       = filename.split('.').last

      # Save the file with the proper file extension
      new_file = f if ext == format
  end

  # Return the file to be stored by CarrierWave
  new_file
end

2 个答案:

答案 0 :(得分:5)

好吧,经过几个小时的撞击墙壁后,光线终于亮了起来。解决方案是CarrierWave处理上传的方式。定义版本时,CW使用新名称([版本名称] _original_filename)复制文件,并在current_path变量中将其提供给您。你可以用这个文件引用做任何你想做的事情(即打开文件并截断​​它,或用随机日期等填写它),当你完成后,CW将为你存储文件。

不知怎的,我错过了这种联系,当我意识到发生了什么事时,它几乎让我蒙羞。我在这里回答这个问题,以便它可以帮助其他一些在黑暗中迷失的可怜的灵魂。并向世人展示我的无知。 :/

答案 1 :(得分:0)

我不知道CarrierWave。但是你是返回zip文件对象。它是你想传递的,还是你希望传递文件的名称?或者你想要提取文件并将提取的文件路径传回去吗?