我在内存中生成了许多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
Ruby带有一个非常方便的StringIO库 - 这可以用于使用String作为输出IO对象或伪造读取由String支持的文件.
这里的挑战是RubyZip在创建时不支持直接获取IO对象Zip::ZipOutputStream,但是如果你看一下该实现initialize,并且根据你的实验意愿,你可以扩展该类并允许它采取构造函数中的IO对象或文件名.
| 归档时间: |
|
| 查看次数: |
12499 次 |
| 最近记录: |