3

我的用户上传了一个包含 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
4

2 回答 2

5

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

不知何故,我错过了连接,当我意识到发生了什么时,它几乎让我失明。我在这里回答这个问题,以便它可以帮助其他一些在黑暗中迷失的可怜的灵魂。并向世界展示我的无知。:/

于 2011-02-11T15:50:24.260 回答
0

我不知道 CarrierWave。但是您正在返回 zip 文件对象。是你想要传递的还是你想要传递的文件名?或者您是否希望提取文件并将提取的文件路径传回?

于 2011-02-11T11:40:48.990 回答