我在内存中生成了许多PDF文件,我想在将其作为邮箱附件发送之前将其压缩为一个zip文件.我看过Rubyzip,它不允许我在不保存到磁盘的情况下创建zip文件(可能我错了).

有没有什么方法可以在不创建临时文件的情况下压缩这些文件?

推荐答案

我有一个类似的问题,我用rubyzip gem和stringio对象解决了这个问题.

您可以使用put_next_entry和write创建您喜欢的zip文件 struct ,完成后,您可以倒带stringio并使用sysread读取二进制数据.

请参见以下简单示例(适用于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

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

The following example works for 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

在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相关问答推荐

鲁比.METHOD_MISSING+SEND对于带有命名参数的混合参数失败

清理 jruby 中输入数据的编码错误

RVM 和 OpenSSL 的问题

如何在 Ruby 中合并多个哈希?

在 Ruby 中导出环境变量

Ruby:子字符串到一定长度,也到子字符串中的最后一个空格

哈希或其他对象的内存大小?

Rails 类 << self

Ruby 模块 - 包括 do 结束块

无法正确自动生成 Ruby DevKit 配置文件

Ruby 中方法名称的限制是什么?

对于基于 GitHub 的 gem,强制Bundle 安装使用 https:// 而不是 git://

Unexpected Return (LocalJumpError)

Ruby 中的文件打开模式

Ruby中block和&block的区别

项目目录的相对路径

使用整数作为哈希键

什么是 Rakefile?

如何在 Ruby 中使用全局变量或常量值?

如何使用#{variable}在Ruby中格式化带有浮点数的字符串?