ComfyUI Node

File Uploader

No shell access? This is how you get a font (or any file) into hosted ComfyUI

By beverlyhillscop90210·Created 4 months ago·Updated 4 months ago· 2
File Uploader
    • file_path
    • folder_path
    • filename
    file
    subfolderfonts

    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 - multipart file + subfolder, writes the file into input/<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, default fonts) - the subdirectory of input/ to upload into and read from. Defaults to fonts because that's the author's use case; set it to whatever your loader expects.
    • file (dropdown) - lists whatever's in input/<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's CR 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 FileNotFoundError and tells you to upload it again.
    • Keep subfolder in 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.

    Categoryutils/io

    Inputs (2)

    NameTypeDefaultDescription
    fileCOMBO1 options: (no files yet, click upload)
    subfolderSTRINGfonts

    Outputs (3)

    NameTypeDescription
    file_pathSTRING
    folder_pathSTRING
    filenameSTRING