Class: ZipTricks::OutputEnumerator
- Inherits:
-
Object
- Object
- ZipTricks::OutputEnumerator
- Defined in:
- lib/zip_tricks/output_enumerator.rb
Overview
Can be used as a Rack response body directly. Will yield a Streamer for adding entries to the archive and writing zip entry bodies.
Direct Known Subclasses
Instance Method Summary collapse
-
#each ⇒ Object
Executes the block given to the constructor with a Streamer and passes each written chunk to the block given to the method.
-
#initialize(**streamer_options, &blk) ⇒ OutputEnumerator
constructor
Prepares a new Rack response body with a Zip output stream.
Constructor Details
#initialize(**streamer_options, &blk) ⇒ OutputEnumerator
Prepares a new Rack response body with a Zip output stream. The block given to the constructor will be called when the response body will be read by the webserver, and will receive a Streamer as it's block argument. You can then add entries to the Streamer as usual. The archive will be automatically closed at the end of the block.
# Precompute the Content-Length ahead of time
content_length = ZipTricks::SizeEstimator.estimate do | estimator |
estimator.add_stored_entry(filename: 'large.tif', size: 1289894)
end
# Prepare the response body.
# The block will only be called when the
# response starts to be written.
body = ZipTricks::OutputEnumerator.new do | streamer |
streamer.add_stored_entry(filename: 'large.tif', size: 1289894, crc32: 198210)
streamer << large_file.read(1024*1024) until large_file.eof?
...
end
return [200, {'Content-Type' => 'binary/octet-stream',
'Content-Length' => content_length.to_s}, body]
29 30 31 32 |
# File 'lib/zip_tricks/output_enumerator.rb', line 29 def initialize(**, &blk) @streamer_options = .to_h @archiving_block = blk end |
Instance Method Details
#each ⇒ Object
Executes the block given to the constructor with a Streamer and passes each written chunk to the block given to the method. This allows one to "take" output of the ZIP piecewise.
37 38 39 40 41 42 43 44 |
# File 'lib/zip_tricks/output_enumerator.rb', line 37 def each if block_given? block_write = ZipTricks::BlockWrite.new { |chunk| yield(chunk) } ZipTricks::Streamer.open(block_write, **@streamer_options, &@archiving_block) else enum_for(:each) end end |