Skip to main content

Create a streamable and (somewhat) seekable .ZIP file

Project description

Similar systems/projects:

  • The Nginx zip module. Only for Nginx, so can’t be used with other webservers.
  • python-zipstream. Does not support calculating the file size beforehand or seeing through the file.

Usage:

import zipseeker

# Create an index
fp = zipseeker.ZipSeeker()
fp.add('some/file.txt')
fp.add('another/file.txt', 'file2.txt')

# Calculate the total file size, e.g. for the Content-Length HTTP header.
contentLength = fp.size()

# Calculate the last-modified date, e.g. for the Last-Modified HTTP header.
lastModified = fp.lastModified()

# Send the ZIP file to the client
# Optionally add the start and end parameters for range requests.
# Note that the ZIP format doesn't support actually skipping parts of the file,
# as it needs to calculate the CRC-32 of every file at the end of the file.
fp.writeStream(outputFile)

Why?

While the file size of a ZIP file usually can’t be calculated beforehand due to compression, this is actually optional. The headers itself also have a pretty constant size. That means that the whole file can have a predetermined file size (and modtime).

This is useful when you want to provide ZIP downloads of large directories with uncompressable files (e.g. images). The specific use case I created this media file for was to provide downloads of whole photo albums without such inconveniences as requesting a downloading link in an e-mail, using a lot system resources for the creation of temporary files, and having to delete these files afterwards.

Of course, it’s possible to just stream a ZIP file, but that won’t provide any progress indication for file downloads and certainly doesn’t support Range requests.

For more information, see the Nginx zip module.

TODO

  • Implement actual seeking in the file - this should be doable.
  • Use a CRC-32 cache that can be shared by the calling module.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
zipseeker-1.0.11.tar.gz (5.8 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page