Amazon S3 is an excellent place to store files, but it has a blind spot: it has no idea how to hand someone a zip archive. When you need to share a set of objects, a single downloadable archive is usually what people want — and S3 cannot produce one on its own.
The old way: download, zip, upload
The obvious approach is to download the files to your machine or to an EC2 instance, zip them locally, and upload the result back to S3. It works, but it is slow and wasteful:
- You pay for bandwidth in both directions and for the instance that does the work.
- The files have to fit on local disk, and the process needs roughly twice the space of the final archive.
- There is cleanup to remember, and the whole thing has to be scripted and monitored.
- It is impractical when the objects are large or when the request arrives at an inconvenient moment.
The other old way: zip before upload
Compressing files before uploading them to S3 works well for static content, but it does not help when the set of files someone needs is only known at request time. It also does nothing for files generated dynamically on the fly.
Zipping files in place
A better approach is to let the compression happen inside AWS. The engine reads the requested objects directly from S3, streams them through a zip writer, and writes the archive back to the same bucket. No local disk, no download, and no long-lived worker instance. The result is a normal S3 object, so you can hand the user a short-lived, signed download URL.
S3zipper implements this pattern as an API. You send a list of objects (or a folder prefix), the job runs in the background, and you receive a task id you can poll. When the job finishes, you get back a presigned URL for the archive.
When this approach pays off
- Sharing ad-hoc sets of files — for example "everything in
invoices/2026/". - Dynamically generated files — the contents are decided per request.
- Large archives — the files never leave the AWS network for the compression step.
- Small servers — the API does the heavy lifting, so your machine only makes one HTTP request.
If you are already comfortable with the API, start with the step-by-step zip-and-download guide or the zipstart endpoint walkthrough.