Ruby:下载压缩文件并解压



我有一个ruby脚本,它使用ruby的open命令从服务器下载远程ZIP文件。当我查看下载的内容时,它显示如下:

PKx03x04x14x00bx00bx00x9Bx84PGx00x00x00x00x00x00x00x00x00x00x00x00nx00x10x00foobar.txtUXfx00x86v!Vx85v!VxF6x01x14x00KxCBxCFOJ,RHx03S\x00PKabxC1xC0x1FxE8fx00x00x00x0Ex00x00x00PKx01x02x15x03x14x00bx00bx00x9Bx84PGxC1xC0x1FxE8fx00x00x00x0Ex00x00x00nx00fx00x00x00x00x00x00x00x00@xA4x81x00x00x00x00foobar.txtUXbx00x86v!Vx85v!VPKx05x06x00x00x00x00x01x00x01x00Dx00x00x00Tx00x00x00x00x00

我尝试使用Rubyzip gem (https://github.com/rubyzip/rubyzip)及其类Zip::ZipInputStream像这样:

stream = open("http://localhost:3000/foobar.zip").read # this outputs the zip content from above
zip = Zip::ZipInputStream.new stream

不幸的是,这会抛出一个错误:

 Failure/Error: zip = Zip::ZipInputStream.new stream
 ArgumentError:
   string contains null byte

我的问题是:

    一般来说,下载ZIP文件并在内存中提取其内容是可能的吗?Rubyzip是合适的库吗?
  1. 如果是,我如何提取内容?

我自己找到了解决方案,然后在stackoverflow:D(如何在Ruby中迭代内存中的zip文件)

input = HTTParty.get("http://example.com/somedata.zip").body
Zip::InputStream.open(StringIO.new(input)) do |io|
  while entry = io.get_next_entry
    puts entry.name
    parse_zip_content io.read
  end
end
  1. 下载你的ZIP文件,我使用HTTParty(但你也可以使用ruby的open命令(require 'open-uri'))。
  2. 使用StringIO.new(input)转换为StringIO
  3. 使用io.get_next_entry遍历ZIP存档中的每个条目(它返回Entry的实例)
  4. 使用io.read获得内容,使用entry.name获得文件名。

就像我在https://stackoverflow.com/a/43303222/4196440中评论的那样,我们可以使用Zip::File.open_buffer:

require 'open-uri'
content = open('http://localhost:3000/foobar.zip')
Zip::File.open_buffer(content) do |zip|
  zip.each do |entry|
    puts entry.name
    # Do whatever you want with the content files.
  end
end

相关内容

  • 没有找到相关文章

最新更新