在rails中使用rubzip2和paperclip,如何创建临时zip文件并将其保存到回形针?

Min*_*ure 2 ruby zip ruby-on-rails paperclip mime-types

我有一些珍贵的代码压缩了一大堆文件,它在tmp文件系统中创建了一个zip文件,并在那里添加了文件.

我试图通过使用ruby的Tempfile将文件存储在代码中而不是手动将其自己写入tmp目录并稍后删除它来提高效率.

我写了这段代码试着去做...

def zip_up_files
  require 'zip/zip'

  t = Tempfile.new(["temp-filename-#{export_type}", '.zip'], :type => 'application/zip')
  Zip::ZipOutputStream.open(t.path) do |z|
    #pop some files in the zip...
  end

  #save it to the has_attachment :download on the model
  self.download = File.open(t.path)
  self.save

  #delete TempFile...
  t.close
end
Run Code Online (Sandbox Code Playgroud)

此sucsfullt将Tempfile保存到模型上的.download.但是,如果您现在导航到已保存的zip文件,则它不是zip文件而是乱码文本文档.我想知道在将它保存到模型之前是否有缺少创建或保存zip的东西.我已经尝试将该类型放入TempFile创建中.看起来拉链缺少MimeType.但我不确定,有人可以帮忙吗?

谢谢!

dav*_*nes 5

问题是,您已经将二进制文件写入磁盘,但是然后以文本模式而不是二进制模式打开它.这肯定会弄乱数据.

# Opens in text mode by default!
#self.download = File.open(t.path)

# Change to...
self.download = File.open(t.path, 'rb')
Run Code Online (Sandbox Code Playgroud)

顺便提一下,close不删除临时文件.当文件句柄被垃圾收集时,文件将被删除.建议unlink明确调用删除临时文件,否则磁盘上会有大量的临时文件等待垃圾回收.(参见TempFile文档中概要和良好实践.)

#delete TempFile...
t.close
t.unlink
Run Code Online (Sandbox Code Playgroud)