【问题标题】:Zlib gunzip only returning partial fileZlib gunzip 仅返回部分文件
【发布时间】:2019-10-16 19:33:30
【问题描述】:

我有一个 27MB 的 .gz 文件(解压缩后为 127MB)。使用 ruby​​ 的 Zlib 解压缩文件会返回格式正确的数据,但文件会被截断为预期大小的一小部分(253,000 行数据中的 1290 行数据)。

string_io = StringIO.new(body)
file = File.new("test.json.gz", "w+")
file.puts string_io.read
file.close

# string_io.read.length == 26_675_650
# File.size("test.json.gz") == 27_738_775

使用 GzipReader:

data = ""
File.open(file.path) do |f|
  gz = Zlib::GzipReader.new(f)
  data << gz.read
  gz.close
end
# data.length = 603_537

使用不同的 GzipReader 方法:

data = ""
Zlib::GzipReader.open(file.path) do |gz|
  data << gz.read
end
# data.length == 603_537

使用 gunzip:

gz = Zlib.gunzip(string_io.read)
# gz.length == 603_537

预期大小为 127,604,690,但我只能提取 603,537。在我的终端中使用 gunzip 可以正确提取整个文件,但我正在寻找一种编程方式来处理这个问题。

【问题讨论】:

  • 你在哪里定义body
  • @lacostenycoder body 是我从 S3 存储桶中提取的字符串

标签: ruby-on-rails ruby gzip zlib


【解决方案1】:

您是否尝试过使用Zlib::GzipReader.open(),而不是打开文件并传递文件处理程序?它记录在这里https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html

我在本地测试并且能够得到正确的结果:

data = ''
=> ""

Zlib::GzipReader.open('file.tar.gz') { |gz|
  data << gz.read
}

data.length
=> 750003

然后检查未压缩的文件大小:

gzip -l file.tar.gz                                                                                                                           
  compressed uncompressed  ratio uncompressed_name
      315581       754176  58.1% file.tar

编辑:看到您正在通过 S3 API 提取数据的更新。确保在将正文写入文件之前对正文进行 Base64 解码。

【讨论】:

  • 感谢您的回复!我已经尝试过了,得到了相同的结果:file = File.open("test.json.gz", "w+"); file.puts string_io; file.close; # File.size("test.json.gz") == 27738775; data = ""; Zlib::GzipReader.open(file.path) do |gz|; data &lt;&lt; gz.read; end; # data.length == 603537;
  • 您很可能会错误地写入文件。编写文件,退出到 shell 并尝试使用 gunzip 工具解压缩并确保它可以正常工作。您可能应该使用 Zlib::GzipWriter 来编写文件:ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html - 另请参阅我关于解码可能从 S3 api 返回的 base64 的更新
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多