Reputation: 1093
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
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