如何在不使用Ruby保存到磁盘的情况下生成zip文件?

Mar*_*nos 36 ruby zip

我在内存中生成了许多PDF文件,我想将它们压缩成一个zip文件,然后再将其作为电子邮件附件发送.我看过Rubyzip并且它不允许我创建一个zip文件而不将其保存到磁盘(也许我错了).

有没有办法在不创建临时文件的情况下压缩这些文件?

vas*_*vas 50

我遇到了类似的问题,我使用rubyzip gem和stringio对象解决了这个问题.事实证明,rubyzip提供了一个返回stringio对象的方法:ZipOutputStream.write_buffer.

您可以根据自己的喜好使用put_next_entry和编写创建zip文件结构,一旦完成,您可以使用sysread回放stringio并读取二进制数据.

请参阅以下简单示例(适用于rubyzip 0.9.X)

require 'zip/zip'
stringio = Zip::OutputStream.write_buffer do |zio|
  zio.put_next_entry("test.txt")
  zio.write "Hello world!"
end
stringio.rewind
binary_data = stringio.sysread
Run Code Online (Sandbox Code Playgroud)

测试jruby 1.6.5.1(ruby-1.9.2-p136)(2011-12-27 1bf37c2)(Java HotSpot(TM)64位服务器VM 1.6.0_29)[Windows Server 2008-amd64-java])

以下示例适用于rubyzip> = 1.0.0

require 'rubygems'    
require 'zip'
stringio = Zip::OutputStream.write_buffer do |zio|
  zio.put_next_entry("test.txt")
  zio.write "Hello world!"
end
binary_data = stringio.string
Run Code Online (Sandbox Code Playgroud)

在OpenJDK 64位服务器VM 1.7.0_79-b14 + jit [linux-amd64]和rubyzip gem 1.1.7上测试jruby 1.7.22(1.9.3p551)2015-08-20 c28f492

  • 现在write_buffer是Zip :: OutputStream :: write_buffer (2认同)

rud*_*rud 5

Ruby带有一个非常方便的StringIO库 - 这可以用于使用String作为输出IO对象或伪造读取由String支持的文件.

这里的挑战是RubyZip在创建时不支持直接获取IO对象Zip::ZipOutputStream,但是如果你看一下该实现initialize,并且根据你的实验意愿,你可以扩展该类并允许它采取构造函数中的IO对象或文件名.