Metaphysiker
Metaphysiker

Reputation: 1093

How do I create folders inside Zip::OutputStream?

I want to create a Zip-file with folders or directories in it, using Ruby-on-Rails and Zip.

How do I create folders or directories inside Zip::OutputStream?

What I currently have

compressed_filestream = Zip::OutputStream.write_buffer do |zos|

  zos.put_next_entry "letter.odt"
  zos.write letter

  zos.put_next_entry "spreadsheet.ods"
  zos.write spreadsheet

  zos.put_next_entry "essay.odt"
  zos.write essay
end

compressed_filestream.rewind
send_data compressed_filestream.read, filename: "neuer_tn.zip"

This code produces a Zip-file and I can extract the three files from it, called "letter.odt", "spreadsheet.ods" and "essay.odt".

Now, I want that the first two files are inside a folder or inside a directory. When I extract the Zip-file, I should see a folder called "letter and spreadsheet", where two files are inside, and one file outside of it. How can I do that?

Is something like the following code possible?

compressed_filestream = Zip::OutputStream.write_buffer do |zos|

  zos.create_folder "letter and spreadsheet" do 
  
    zos.put_next_entry "letter.odt"
    zos.write letter

    zos.put_next_entry "spreadsheet.ods"
    zos.write spreadsheet

  end

  zos.put_next_entry "essay.odt"
  zos.write essay
end

compressed_filestream.rewind
send_data compressed_filestream.read, filename: "neuer_tn.zip"

Rails 6.0.3.4, ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]

Upvotes: 4

Views: 834

Answers (1)

dbugger
dbugger

Reputation: 16399

It's very straightforward, include the folder name in the put_next_entry call...

zos.put_next_entry "awesome_folder_here/letter.odt" 

You can even go deeper...

zos.put_next_entry "awesome_folder_here/subfolder_too/letter.odt" 

And the zip knows how to put it all together.

Upvotes: 5

Related Questions