Appearance
File uploads
How the File upload field lets visitors attach a file to a form, where the file is stored, the size limit, and how the file ends up as a member-only download link in the submission.
Add a File upload field (from the Input group) when you want visitors to send you a document, image, receipt or similar. Like other inputs it takes a Field name so the file is bound to the submission, and you can optionally restrict the file types and mark it required.
The File upload field
| Property | What it does |
|---|---|
| Field name | Binds the uploaded file to the submission. Required for the file to be saved. |
| Label | The prompt shown above the picker (defaults to "Attach a file"). |
| Accepted types | Limits the file picker, e.g. image/*,.pdf. Advisory — the real gate is the size and storage rules below. |
| Helper text | A hint shown under the field. |
| Required | Marks the field mandatory. |
As soon as a visitor picks a file, it uploads in the background and the field shows Uploading…, then Uploaded <filename>. They can carry on filling in the rest of the form while that happens.
The 10 MB cap
A single upload may be at most 10 MB. A larger file is rejected with a "File too large" message and nothing is stored. The upload endpoint is also public (form visitors aren't signed in), so it is rate-limited — a burst of uploads from the same address is throttled to keep spammers out.
NOTE
The 10 MB limit is per file. If you need visitors to send several files, add several File upload fields, each with its own field name.
Where files are stored
Uploaded bytes are stored in GridFS — MongoDB's built-in file storage — so FlowRunner needs no external file service or S3 bucket to accept attachments. Each stored file keeps its original filename and content type, plus metadata recording which project it belongs to.
The storage layer is pluggable: GridFS is the default adapter, and an S3/CDN adapter could be swapped in later without changing how forms or submissions behave.
How the file lands in the submission
The field doesn't put the file itself into the response — it stores the file and puts a link to it into the submission under your field name.
So in the Submissions inbox that field's value is the file's URL, which the responses table renders as a clickable File link.
Downloads are member-gated
The upload endpoint accepts files from the public, but the download endpoint does not. Fetching a stored file requires that you are:
- signed in, and
- a member (viewer or above) of the project the file belongs to.
Anyone else — including the visitor who uploaded it and anyone with the raw link — is refused. Files are always served as an attachment (never rendered inline) with nosniff and no-store caching, so an uploaded HTML or SVG file can't execute in the app and browsers don't cache it. This keeps potentially sensitive uploads private to your team.
WARNING
Because downloads require project membership, sharing a file link with someone outside the workspace won't give them access. To hand a file to an outsider, download it yourself and send it on.