RHUploadZip_V2
Feed ComfyUI a whole folder of images at once
- images(as list)
- masks(as list)
- folder_path
- manifest
The name sounds like an API wrapper, but it's a lie in the best way: RHUploadZip_V2 calls nothing and needs no key. It's a local utility that turns one .zip file into a ready-to-process batch of images. If you've ever stared at ComfyUI's LoadImage while holding a thousand reference photos - one drag-and-drop at a time - you already know why this node exists. There's a whole corner of r/comfyui full of "I created 20,000 images, now what?" threads; this pack is the input side of that problem, solved with the one format everyone already knows how to produce.
How it works
The node's single input, image, is a dropdown that lists every .zip in your input/ directory. On top of that, a small frontend extension adds an Upload ZIP button to the node - click it, pick a file, and it POSTs to the same /upload/image endpoint LoadImage uses, dropping the archive into input/ and selecting it for you.
On run, it's a careful little engine:
- It validates the archive, then walks every member, rejecting absolute paths and anything trying to escape via
..(zip-slip is real; this node checks). - It skips directories, hidden files, and
__MACOSXjunk - so a zip made on a Mac doesn't spew._twins into your batch. - Only
.png,.jpg,.jpeg, and.webpcount. A zip full of.tiffor.bmpwill error out with "No supported images found in zip archive." - Extracted files land in a fresh
batchimages_*subfolder under ComfyUI's temp directory, notinput/. Treat it as scratch. - Each image is decoded with EXIF-transpose applied, converted to RGB, and - if it has an alpha channel - converted to a mask, using the inverted-alpha convention ComfyUI's own loader uses. Multi-frame files (GIF, animated PNG) are skipped with a console warning rather than silently mangled.
The outputs that matter
Four outputs, and the first two are the reason the pipeline works:
images(as list)- an IMAGE list, one tensor per image in the zip.masks(as list)- the matching mask list (a blank 64×64 mask for images with no alpha).folder_path- the temp extraction directory, in case some downstream node wants the actual files.manifest- a JSON string describing every image: original filename, stem, extension, relative path, index, and total count. This is the connective tissue the other two nodes in this pack read, and it's how your original names survive the round trip.
One thing to know about lists in ComfyUI: images(as list) is a list-typed output, which is fine. Wire it into a node that takes a single IMAGE and ComfyUI just runs that node once per item - that's how a graph fans out over a batch. If a node chokes on a list, that's the node fighting the engine, not you.
Installing it
This is the good news. The pack has no requirements.txt, no install script, no model downloads - it only uses Python's standard library plus torch/PIL/numpy, which ComfyUI already ships. The README's entire install procedure:
cd ComfyUI/custom_nodes
git clone https://github.com/kegeai888/ComfyUI_BatchImages
Then restart ComfyUI. The nodes show up under the BatchImages category. It may also appear in ComfyUI Manager's catalog under "ComfyUI_BatchImages" - but the README only documents the manual route, and given there's nothing to install, cloning is genuinely the fastest path. With zero dependencies and no author code running at install time, this is about as low-risk a custom node as exists.
Gotchas
The two that bite people: unreadable images are skipped, not fatal - if one PNG in the zip is corrupt, it's dropped with a warning, and you only get a hard error if nothing reads. And multi-frame images are skipped silently (warning in the console), so a zip full of animated GIFs will quietly come back with a lot fewer images than you thought. Count your outputs against your manifest before you trust the batch. Also, the extraction folder is in temp/ - ComfyUI treats that as disposable, so copy out anything you need long-term instead of assuming the files stay put.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| image | COMBO | 0 options: |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images(as list) | IMAGE | — |
| masks(as list) | MASK | — |
| folder_path | STRING | — |
| manifest | STRING | — |