Nodes/ComfyUI-CloudStorage/Save Image To Cloud
ComfyUI Node

Save Image To Cloud

Save Image To Cloud — your outputs end up in a bucket, not on your disk

By philipy1219·Created about a year ago·Updated about a year ago· 2
Save Image To Cloud
  • images
  • urls
storage_typeoss
filename_prefixComfyUI
endpoint
bucket
prefixcomfyui/
regionus-east-1

This is the node for the "my outputs should not live on this machine" workflow. Save Image To Cloud is a drop-in replacement for ComfyUI's built-in Save Image, except instead of writing a PNG into ComfyUI/output/, it uploads to an Aliyun OSS or AWS S3 bucket and hands you back the URL. The niche is real if you run ComfyUI on a rented GPU box that you don't trust to keep files, or you want renders to land somewhere the whole team - or a website - can read without you SSHing in to grab them.

One warning before you get excited: the README will lie to you a little. It documents access_key_id and access_key_secret inputs that don't exist on the actual node. The credentials come from environment variables instead (more on that below), so if you try to set up the node exactly like the README shows, it won't match.

How it works

Feed it an images tensor - same thing that comes out of VAE Decode - and it converts each image to a PNG in memory, then pushes it to your bucket via the oss2 (OSS) or boto3 (S3) SDK. It also does the standard ComfyUI trick of embedding the workflow's prompt and extra PNG info into the file's metadata (disabled only if you launched ComfyUI with --disable-metadata). Filenames follow the pattern {prefix}{filename_prefix}_{timestamp}_{batch}.png, so you get a fresh timestamped file every run instead of overwriting.

The one output, urls, is a JSON string of objects - [{url, filename, timestamp, storage_type}] - not the semicolon-separated list the README claims. Wire it into a text display node to see the URLs, or into any node that accepts string input if you're scripting around it.

The inputs that matter

  • storage_type - oss or s3. Pick your provider.
  • endpoint - OSS: like oss-cn-beijing.aliyuncs.com (no scheme). S3: optional, e.g. https://s3.amazonaws.com; leave blank for standard S3.
  • bucket - your bucket name.
  • prefix / filename_prefix - the storage path and the filename stem; together they decide where the file lands.
  • region - S3 only, defaults to us-east-1.

The big gotcha: credentials live in environment variables

There are no key inputs on this node, which is a security win - your access keys can never get baked into a saved workflow JSON or the PNG metadata (a real worry with cloud nodes that take keys as widgets). But it means setup is a step most people don't expect:

# for OSS
export ALIYUN_ACCESS_KEY_ID=your_key_id
export ALIYUN_ACCESS_KEY_SECRET=your_secret
# for S3
export AWS_ACCESS_KEY_ID=your_key_id
export AWS_SECRET_ACCESS_KEY=your_secret

Missing them raises Missing required environment variables for oss/s3 storage. This is by far the most common "why is it erroring" moment, so set them in whatever launches ComfyUI, then restart.

Install

Via ComfyUI Manager - search "ComfyUI-CloudStorage" and install. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/philipy1219/ComfyUI-CloudStorage
pip install oss2 boto3

No model downloads - the dependencies are just the two SDKs. Remember that a returned URL only works if the bucket actually lets you read it; a private bucket gives you a URL that 403s in a browser, so set the access policy you actually want.

If you need a dozen providers, progress bars, and local-fallback saves, ComfyUI Save/Load Extended (bytes2pro) is the heavier, more polished alternative. This pack's whole personality is "OSS or S3, nothing else, minimal friction." That's plenty if OSS/S3 is what you have.

Categorycloud_storage

Inputs (7)

NameTypeDefaultDescription
imagesIMAGEImages to be saved
storage_typeCOMBOoss2 options: oss, s3
filename_prefixSTRINGComfyUIPrefix for the filename
endpointSTRING
bucketSTRING
prefixSTRINGcomfyui/Storage path prefix
regionoptSTRINGus-east-1Region for S3 storage only

Outputs (1)

NameTypeDescription
urlsSTRING