Ino S3 Download File
Fetch one file from S3 into a local folder — with smart skip logic
- success
- message
- rel_path
- abs_path
The bread-and-butter S3 operation, done properly: InoS3DownloadFile fetches a single object from a bucket and saves it into a local folder under ComfyUI's input, output, or temp trees. It's the node you put at the front of a workflow that needs a file that's not on the machine yet - a reference image, a config, a seed batch - and it's designed for repeat runs, because by default it skips the download when the local file already matches what's in S3.
That skip behavior is the detail that makes it production-usable. The overwrite tooltip spells out the mechanism: when overwrite is False (the default), it compares the local file against the remote using a "sha256/md5/size cascade" - hash check first, falling back through md5 to size. Run the same workflow ten times and you pay for the download once; every subsequent run just confirms nothing changed.
How it works
Required inputs: enabled, s3_key (the object path, e.g. input/example.png), parent_folder (input/output/temp), and folder (the local subfolder, default s3download/). Optional: s3_config (the JSON credentials string) and overwrite.
Outputs follow the pack's standard file-node contract: success, message, rel_path, and abs_path - the last two being where the file actually landed, so you can wire them into a loader that takes a path.
Credentials: paste the JSON into s3_config, or leave it empty and use the env vars S3_ACCESS_KEY, S3_ACCESS_SECRET, S3_BUCKET_NAME, S3_ENDPOINT_URL, S3_REGION_NAME. Env vars beat embedding keys in workflows.
Installing it
Part of the 125+-node ComfyUI-InoNodes pack by nobandegani:
cd ComfyUI/custom_nodes
git clone https://github.com/nobandegani/comfyui_ino_nodes
cd comfyui_ino_nodes
pip install -r requirements.txt
Or search "ComfyUI Ino Nodes" in ComfyUI Manager and restart. Needs inopyutils (the pack's S3 layer) and a current V3-schema ComfyUI.
Common issues
Path mismatch is the top gotcha: parent_folder + folder must resolve to where you actually want the file, and folder is relative to the base. The abs_path output tells you the truth - check it if a downstream loader can't find the file. If you changed the remote file and local keeps coming back stale, that's the skip logic working as designed: flip overwrite to True for a forced refresh, or delete the local copy. And remember S3 keys are case-sensitive; Example.png and example.png are different objects, and a mistyped key gives you a clean success: False rather than a mystery.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | true | — |
| s3_key | STRING | input/example.png | — |
| parent_folder | COMBO | 3 options: input, output, temp | |
| folder | STRING | s3download/ | — |
| s3_configopt | STRING | {"access_key_id": "", "access_key_secret": "", "bucket_name": "", "endpoint_url": "", "region_name": ""} | you can leave it empty and pass it with env vars |
| overwriteopt | BOOLEAN | false | If False (default), skip the download when the local file already matches the remote (sha256/md5/size cascade). |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| success | BOOLEAN | — |
| message | STRING | — |
| rel_path | STRING | — |
| abs_path | STRING | — |