Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add file to zip archive without compression

Tags:

zip

go

epub

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.

like image 395
Kim Avatar asked May 17 '14 23:05

Kim


1 Answers

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.

like image 189
James Henstridge Avatar answered Oct 15 '22 02:10

James Henstridge