mace
mace

Reputation: 11

rubyzip: open zip, modify it temporary, send to client

i want to temporary modify a zip file and send the changed file to the client.

right now i create a file stream and send it:

  require 'zip'
  zip_stream = Zip::OutputStream.write_buffer do |zip|
    zip.put_next_entry 'new_folder/file'
    zip.print "some text"
  end

  zip_stream.rewind
  send_data zip_stream.read, type: 'application/zip', disposition: 'attachment', filename: 'thing.zip'

i dont get how i can open a existing zip in the filesystem and put additional file in it and send it without saving it do the disk.

can you give me a hint?

Upvotes: 0

Views: 762

Answers (2)

mace
mace

Reputation: 11

in the end i did it like this:

require 'zip'
zip_stream = Zip::OutputStream.write_buffer do |new_zip|

 existing_zip = Zip::File.open('existing.zip')
 existing_zip.entries.each do |e|
   new_zip.put_next_entry(e.name)
   new_zip.write e.get_input_stream.read
 end

 new_zip.put_next_entry 'new_file'
 new_zip.print "text"
end

Upvotes: 1

Arvind
Arvind

Reputation: 2781

Check this https://github.com/rubyzip/rubyzip

require 'rubygems'
require 'zip'

folder = "Users/me/Desktop/stuff_to_zip"
input_filenames = ['image.jpg', 'description.txt', 'stats.csv']

zipfile_name = "/Users/me/Desktop/archive.zip"

Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
  input_filenames.each do |filename|
    # Two arguments:
    # - The name of the file as it will appear in the archive
    # - The original file, including the path to find it
    zipfile.add(filename, File.join(folder, filename))
  end
  zipfile.get_output_stream("myFile") { |f| f.write "myFile contains just this" }
end

Upvotes: 0

Related Questions