Save to ZIP
Package any workflow's output into a ZIP with a download button — original names kept
- zip
- naming
The reverse of Load ZIP, and the reason the pack is a loop instead of a one-way street. This is an output node that takes just about anything your graph produces - image tensors, videos, audio, text - and packs it into a single .zip in ComfyUI's output folder. Then, right there in the node, a Download ZIP button appears so you can pull the whole batch off the server in one click. If you've ever stitched together outputs on a remote box, you know why that button earns its keep.
The catch-all input
The zip input is typed * (wildcard), which in ComfyUI terms means "accept anything and let the node make sense of it." It's genuinely happy to see:
- IMAGE tensors - each image in the batch becomes a file
- VIDEO objects - re-encoded or re-muxed into the archive
- AUDIO dicts - written out as WAV
- STRINGs - saved as text files
- file references from other nodes - copied in under a
files/subfolder
It dedupes as it goes (identical images are skipped by content hash, duplicate archive names get _dup2 suffixes), and it embeds the workflow's prompt and extra_pnginfo into every PNG it writes unless you launched ComfyUI with --disable-metadata. So the ZIP isn't just outputs - it's a self-describing, shareable results package.
Keeping the original filenames
On its own, the node names things ComfyUI_ZIP_00000.png and moves on. That's fine for eyeballing results and useless for anything where names mean something - which is most things, once you're doing real batch work.
The fix is the second input, naming, which is exactly the Naming output from Load ZIP. Wire the two together and every image, video, audio and text entry keeps the filename it had inside the source archive. Round-trip your own zips and you get back a byte-for-byte-familiar folder.
Text has a second convention worth knowing: if a string starts with a first line that looks like a filename - ends in .txt, .json, .srt, or contains a path separator - that line is treated as the archive name and the rest as the content. That's the same convention the pack's Text Relay node is built around, and it's how Load ZIP's TEXT output (which is formatted filename.txt\ncontent) survives the trip back to disk intact.
Installing
ComfyUI Manager → search jayhuang-zip-unpack-images, or:
cd ComfyUI/custom_nodes
git clone https://github.com/aixqueen/jayhuang-zip-unpack-images.git
Restart ComfyUI. No models, no API keys, no hidden setup. The only declared dependency is soundfile, and Save to ZIP doesn't even need that - it re-encodes audio to WAV using the stdlib. (The requirement is there for Load ZIP's non-WAV decoding.)
Gotchas
The node raises "Nothing was written" if its zip input is empty or holds something it can't write - so an all-empty batch fails loudly rather than silently producing a zero-byte archive. That's the right behavior; don't try to wire a disconnected socket and call it a day.
One wrinkle: the output file lands in ComfyUI/output as ComfyUI_ZIP_00001_.zip (the counter increments to avoid clobbering), and the Download button only appears after the node has run once. And as with the rest of this pack, you're on a small, single-commit codebase from a barely-known author - worth the standard security glance, then it's a genuinely handy box to have in your batch workflows.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| zipopt | * | — | |
| namingopt | * | — |
Outputs (0)
No outputs