如何让Zlib从Ruby中的S3流解压缩?
发布时间:2020-12-17 02:40:48 所属栏目:百科 来源:网络整理
导读:应该创建 Ruby Zlib :: GzipReader,传递一个类似IO的对象(必须有一个与IO#读取行为相同的读取方法). 我的问题是我无法从AWS :: S3 lib获得这个类似IO的对象. 据我所知,从中获取流的唯一方法是将块传递给S3Object#stream. 我已经尝试过: Zlib::GzipReader.ne
应该创建
Ruby Zlib :: GzipReader,传递一个类似IO的对象(必须有一个与IO#读取行为相同的读取方法).
我的问题是我无法从AWS :: S3 lib获得这个类似IO的对象. 我已经尝试过: Zlib::GzipReader.new(AWS::S3::S3Object.stream('file','bucket')) # Wich gaves me error: undefined method `read' for #<AWS::S3::S3Object::Value:0x000000017cbe78> 有谁知道我怎么能实现它? 解决方法
一个简单的解决方案是将下载的数据写入
StringIO ,然后将其读回:
require 'stringio' io = StringIO.new io.write AWS::S3::S3Object.value('file','bucket') io.rewind gz = Zlib::GzipReader.new(io) data = gz.read gz.close # do something with data ... 更精细的方法是在流仍在下载时开始膨胀压缩数据,这可以通过IO.pipe来实现.有点像这样: reader,writer = IO.pipe fork do reader.close AWS::S3::S3Object.stream('file','bucket') do |chunk| writer.write chunk end end writer.close gz = Zlib::GzipReader.new(reader) while line = gz.gets # do something with line ... end gz.close 您也可以使用Thread而不是fork: reader,writer = IO.pipe thread = Thread.new do AWS::S3::S3Object.stream('file','bucket') do |chunk| writer.write chunk end writer.close end gz = Zlib::GzipReader.new(reader) while line = gz.gets # do something with line end gz.close thread.join (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- vue发送ajax请求
- ajax – CORS如何比没有跨域限制更安全?在我看来
- xcode – Apple App Loader / iTunes Connect问题
- ruby-on-rails – ActionController ::参数弃用警
- React-Native进阶_1.抽取样式和组件
- ruby-on-rails – 运行初始化程序,除了rake任务
- ruby-on-rails – 在Ruby on Rails中复制文件
- reactor和proactor模式
- Welcome to cx_Oracle’s documentation!
- Hardcoded string "下一步", should use
热点阅读