S3 Image Load from URL
Pull an image from any S3 URL, signed or public, and keep building
- image
- filename
- status
S3 Image Load is the download half of this pack: you hand it a URL and it hands back a ready-to-use IMAGE tensor. The neat part is that it needs zero credentials. No access key, no secret, no bucket name - just a URL. That makes sense once you realize it's not talking to S3's API at all; it's just doing an HTTP GET on a link that happens to point at an object in a bucket. Public URL, presigned URL, CloudFront link, even a plain external CDN - all the same to this node.
It's the natural counterpart to the pack's S3 Image Upload. Upload ends your graph by pushing the render somewhere permanent; this node lets a later run start from that same object. In a shared-bucket setup, node A's s3_urls output can feed node B's url input through a text primitive, and you've got a pipeline where renders move between jobs without any machine in the middle.
How it works
The node downloads the URL with requests (streamed to a temp file), checks that the Content-Type header actually starts with image/, and rejects the URL if it doesn't - a good guard against pasting a link to an HTML page instead of a file. Then it opens the image with Pillow, converts everything to RGB (RGBA gets flattened, so don't expect alpha through this node), normalizes to a [0,1] float tensor, and returns it in standard ComfyUI IMAGE shape. The temp file is cleaned up afterwards, so nothing accumulates on disk.
The inputs and outputs that matter
Inputs are about as minimal as a node gets: url (required, no default) and timeout (default 30 seconds, range 5–300). The filename output is the last path segment of the URL - handy if you want to echo it into a text display or use it as a name downstream.
It returns three things: image (the tensor you wire into whatever comes next), filename, and status. Wire image into your conditioning or img2img setup and you're done.
Install
Same story as the rest of this pack - Manager or manual:
cd ComfyUI/custom_nodes
git clone https://github.com/udayjain26/s3_serverless_inline_storage_utils
Restart, and you'll find it under S3 Serverless Storage. No models to download; the pack's only real pip deps are boto3, botocore, pillow, and requests.
The trap: it fails soft
Here's the one behavior to know about before you trust it in a big graph. On any error - bad URL, timeout, wrong content type - this node does not raise. It returns a black 64×64 dummy image, a filename of error.jpg, and a status string explaining what went wrong. If you wire it into an img2img workflow and a URL rots, you'll silently "succeed" with a tiny black square unless you're reading status. Treat the status output like a canary: display it, or use it to gate downstream nodes. This is a friendly default for a node that might be fed from a text file, but it's a footgun when you assume an error will stop the graph.
Other than that, the usual suspects apply: presigned URLs expire (a signed link is only valid while the signature is, typically 1–7 days depending on how you generated it), and private buckets need a signed URL in the first place. If you keep getting error.jpg back, look at status - it'll tell you whether the problem is the URL, the timeout, or the content type before you go hunting.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | S3 URL or signed URL to image | |
| timeoutopt | INT | 305–300 | Request timeout in seconds |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| filename | STRING | — |
| status | STRING | — |