In Go, how do we add a file to a zip archive without compression?
For context, I'm following along with an IBM tutorial to create an epub zip file. It shows the following Python code:
import zipfile, os
def create_archive(path='/path/to/our/epub/directory'):
'''Create the ZIP archive. The mimetype must be the first file in the archive
and it must not be compressed.'''
epub_name = '%s.epub' % os.path.basename(path)
# The EPUB must contain the META-INF and mimetype files at the root, so
# we'll create the archive in the working directory first and move it later
os.chdir(path)
# Open a new zipfile for writing
epub = zipfile.ZipFile(epub_name, 'w')
# Add the mimetype file first and set it to be uncompressed
epub.write(MIMETYPE, compress_type=zipfile.ZIP_STORED)
# For the remaining paths in the EPUB, add all of their files
# using normal ZIP compression
for p in os.listdir('.'):
for f in os.listdir(p):
epub.write(os.path.join(p, f)), compress_type=zipfile.ZIP_DEFLATED)
epub.close()
In this example, the file mimetype
(which has content application/epub+zip
only) must not be compressed.
The Go documentation does provide one example of writing to a zip archive, but all files are compressed.
There are two methods to add a file to file to a zip.Writer
: the Create
method and the CreateHeader
. While Create
only lets you specify a filename, the CreateHeader
method gives more flexibility including the ability to set the compression method.
For example:
w, err := zipwriter.CreateHeader(&zip.FileHeader{
Name: filename,
Method: zip.Store,
})
You can now write data to w
the same as in the example code from the Go documentation and it will be stored in the zip file without compression.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With