ComfyUI Node

Save to ZIP

Package any workflow's output into a ZIP with a download button — original names kept

By jayhuangaigc·Created 7 months ago·Updated 7 months ago· 3
Save to ZIP
  • 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.

    CategoryJAYHUANG/Zip

    Inputs (2)

    NameTypeDefaultDescription
    zipopt*
    namingopt*

    Outputs (0)

    No outputs