Nodes/S3 Serverless-Inline Storage Utils/S3 File Upload (VHS Compatible)
ComfyUI Node

S3 File Upload (VHS Compatible)

Chain VHS VideoCombine straight into S3 — no local file left behind

By udayjain26·Created about a year ago·Updated 6 months ago· 1
S3 File Upload (VHS Compatible)
  • filenames
  • s3_url
  • status
  • file_size_mb
bucket_name
access_key_id
secret_access_key
regionus-east-1
endpoint_url
folder_pathuploads
filename_prefixs3_video

S3 File Upload is the "anything" uploader in this pack, and its name tells you who it's for: it's VHS-compatible, meaning it plugs directly into the VideoHelperSuite video pipeline. If you've ever built a ComfyUI video workflow that ends with VHS VideoCombine writing an MP4 to your disk, this is the node that takes that output and pushes it straight into a bucket - no manual step, no local file you then have to remember to move.

That's the pitch in one sentence: your rendered video goes from ComfyUI to S3 in the same run that generates it. Given how often video pipelines end in "and then I had to upload the file myself," that's a real quality-of-life win.

How it works

It's a bridge node. VideoHelperSuite's VHS_VideoCombine node outputs a VHS_FILENAMES object - a bundle that carries the list of files it just wrote. This node unwraps that bundle, takes the last file in the list (which is your final rendered video), and uploads it to S3 with the credentials typed into the node. It preserves the original file's extension, so a clip.mp4 becomes s3_video.mp4 (with your filename_prefix swapped in), and it sets the correct Content-Type from a small extension map - video/mp4, video/webm, images, even audio files.

Under the hood it's the same boto3 client as the rest of the pack: no env vars, no credential chain, just the access key and secret you paste in. And it's careful about the obvious failure modes - it refuses to upload if the file doesn't exist, is empty, or the credentials are missing, and it returns a readable status string instead of throwing.

The inputs that matter

  • filenames - the VHS_FILENAMES output from VHS VideoCombine. This is the only wire input, and it's required. No VHS installed, no node.
  • bucket_name, access_key_id, secret_access_key, region - your credentials, inline.
  • endpoint_url - empty for AWS; for Supabase use https://<project>.supabase.co/storage/v1/s3; for R2/MinIO/Spaces use their endpoint.
  • folder_path (default uploads) - the prefix inside the bucket.
  • filename_prefix (default s3_video) - the uploaded file's name, plus the original extension.

Outputs are s3_url, status, and file_size_mb.

Install

VideoHelperSuite is a prerequisite - install it through Manager first if you don't have it. Then this pack, via Manager (search s3_serverless_inline_storage_utils) or:

cd ComfyUI/custom_nodes
git clone https://github.com/udayjain26/s3_serverless_inline_storage_utils

Restart ComfyUI and look under S3 Serverless Storage. No models to download; pip deps are boto3, botocore, pillow, requests (Manager installs them).

Troubleshooting

The status output does most of your debugging: "Invalid VHS filenames input" means the wire is wrong or empty, "No output files from VHS VideoCombine" means VHS didn't produce anything yet (queue the graph once so the combine actually runs), and "File not found" means the path inside the VHS bundle went stale - usually because VHS wrote elsewhere. Check the obvious credential mistakes next, then bucket existence and s3:PutObject permission.

One thing to know: it always takes the last file in the VHS bundle. If you set VHS to also keep intermediate outputs, make sure the final video is last, or you'll upload the wrong file. And the usual security note applies loudly here - the workflow (including your keys, since they live in the node) gets embedded in any PNG you save, so clear the credential fields before sharing your workflow file.

CategoryS3 Serverless Storage

Inputs (8)

NameTypeDefaultDescription
filenamesVHS_FILENAMESVideo filenames from VHS VideoCombine
bucket_nameSTRINGS3 bucket name
access_key_idSTRINGAWS Access Key ID
secret_access_keySTRINGAWS Secret Access Key
regionSTRINGus-east-1AWS region
endpoint_urloptSTRINGCustom S3 endpoint URL (for S3-compatible services like Supabase)
folder_pathoptSTRINGuploadsFolder path within bucket
filename_prefixoptSTRINGs3_videoFilename prefix for uploaded file

Outputs (3)

NameTypeDescription
s3_urlSTRING
statusSTRING
file_size_mbINT