File Uploader
No shell access? This is how you get a font (or any file) into hosted ComfyUI
- file_path
- folder_path
- filename
Some text node wants a font file. You're on a hosted ComfyUI - RunPod, a rented box, a colleague's server - and you have no shell access. You can't scp a .ttf into ComfyUI/input/fonts/, and the whole workflow dead-ends on a file you can't place. That's the exact hole this node plugs. File Uploader is a tiny utils/io utility that gives you a browser-based upload button and hands you back the path the rest of your graph needs.
What it actually does
It's plumbing, not pixels. The node adds one widget - a "📁 Upload file" button - that opens your browser's file picker, uploads the chosen file into a subfolder of ComfyUI's input/ directory, then refreshes its own dropdown. Pick any file type: the README's own example is a brand font for text-render nodes, but the code comments say "fonts, audio, data, whatever." Nothing about it is model-specific.
How it works
Two tiny HTTP endpoints, registered directly on ComfyUI's PromptServer:
POST /file_uploader/upload- multipartfile+subfolder, writes the file intoinput/<subfolder>/GET /file_uploader/list?subfolder=...- returns{files: [...]}to repopulate the dropdown
The frontend half is a JS extension in the pack's web/ directory that patches the node on creation: it finds the file widget, swaps in the upload button, and re-fetches the list whenever you change the subfolder. There's a nice detail under the hood - the node's IS_CHANGED method returns the selected file's mtime, so re-uploading a new version actually marks the node dirty and forces downstream nodes to re-run. No stale output if you overwrite a file mid-workflow.
Path traversal (../) is explicitly blocked, so files stay inside input/. And because it returns a string, not a fancy type, it wires into anything that takes a plain path.
The two inputs and three outputs
Only two inputs, and you'll touch mostly one:
subfolder(STRING, defaultfonts) - the subdirectory ofinput/to upload into and read from. Defaults tofontsbecause that's the author's use case; set it to whatever your loader expects.file(dropdown) - lists whatever's ininput/<subfolder>/. Before you upload anything it literally shows(no files yet, click upload), which is a hint, not a bug.
Outputs:
file_path- the absolute path to the file. Wire this into nodes that want a direct file path.folder_path- the absolute path of the folder. This is the one you want for nodes like Comfyroll'sCR Font File List, which wants a folder to scan.filename- just the bare name, handy for Save nodes or filename math.
Install
The whole pack is two Python files and one JS file - no pip dependencies, no model downloads, nothing heavy. ComfyUI Manager can find it under the pack title comfyui-file-uploader, or drop it in manually:
cd ComfyUI/custom_nodes
git clone https://github.com/beverlyhillscop90210/comfyui-file-uploader
Restart ComfyUI, then hard-refresh the browser (Ctrl+Shift+R). The upload button is frontend JS; if you skip the refresh you'll see the node but no button, which is the #1 "it's not working" report for this kind of pack.
Gotchas
- Persistence is the hosting's job. Files land in
input/, which on RunPod-style setups is usually under/workspace/or wherever the working dir is. That survives pod restarts only if the path sits on persistent storage - on an ephemeral pod your uploads evaporate when the pod does. - No size limit in this node - but your hosting's reverse proxy often has one, typically 100MB+. Don't blame the node for a 2GB upload failing.
- Stale dropdown. The file list is fetched when the node loads or the subfolder changes. If the dropdown shows a file that's since been deleted, the node raises a
FileNotFoundErrorand tells you to upload it again. - Keep
subfolderin sync. The list endpoint and the upload endpoint both read the same widget value, so type the folder once and let the dropdown refresh before you assume it's empty.
Is this node going to be the backbone of your workflow? No. But when you're stuck on a hosted box with a file that needs to be somewhere ComfyUI can see it, a two-minute upload button beats fighting for SSH access - and that's a real fix for a real, boring problem.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| file | COMBO | 1 options: (no files yet, click upload) | |
| subfolder | STRING | fonts | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| file_path | STRING | — |
| folder_path | STRING | — |
| filename | STRING | — |