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.