Skip to content
FormFlow

Accept image uploads on a paid Form

A File question takes JPEG, PNG, WebP and GIF on a paid Plan and is checked even when Strict mode is off. Declare it, bound the file count in the Form's settings, and explain private storage and signed links.

A dark FormFlow plate showing a declared image field kept authoritative at ingestion even when Strict mode is off.

A File question is the one part of a Form that accepts bytes instead of text. On a paid Plan it takes raster images: JPEG, PNG, WebP and GIF. This tutorial declares that field, bounds it, and says what happens to the file after the Submitter presses Send. It stays inside the image boundary throughout, because that boundary is what the feature documents.

What a File question accepts

The format list is an allowlist, not a hint. With no format named, a File question takes the four raster images above. SVG is deliberately absent: an SVG is a script that renders as a picture, and serving one back into an inbox would turn a Form into a script host. Nor is the field an archive drop — no ZIP, no bundle. A Form with no File question refuses multipart uploads outright, so the field is also the switch that turns uploads on.

  • JPEG — photographs and phone-camera output.

  • PNG — screenshots and images with transparency.

  • WebP — the same picture in fewer bytes.

  • GIF — short loops and simple graphics.

Declare the field, then bound it

Add the question, choose File as its type, and leave the accepted formats at the four images. Then set how many files the question will take. The setting belongs to the question, so one Form can ask for a single profile picture and, further down, several screenshots.

Setting

What to choose

Why it matters

Type

File

Declares the field, which makes it authoritative at ingestion.

Accepted formats

JPEG, PNG, WebP, GIF

Anything outside the list is refused, not converted.

Maximum files

Set by the Form

The number of files is bounded by the Form's settings.

Required

On or off

Required turns an empty upload into a refusal.

Authoritative even when Strict mode is off

Strict mode is a per-Form decision. Leave it off and the schema advises; turn it on and the schema decides. A File question does not wait for that decision. A declared File question is checked on every Submission — size, type and content — and it rejects rather than trims. That is deliberate: a file is the one answer that costs storage and can carry code.

So a wrong file is refused even on a relaxed Form. The Submitter is told, and the attempt is kept as a Refused submission you can review. Every other field on that Form can stay advisory; the file cannot.

Where the file goes, and who can open it

An uploaded file is part of the Submission payload, not a public asset. It is stored privately and read through a signed link that expires. There is no public address to guess, and a copied link is not a permanent door into someone's photographs.

Check it once with a real file

Submit the Form once with a JPEG you took on a phone, once with a PNG screenshot, and once with something outside the list. The first two should arrive with the Submission; the third should be refused with a reason. That five-minute pass catches the common mistakes: a field nobody marked Required, a count left at one when the page asks for three photos, or a label that promises a format the field does not take.

Then open one stored image from the Submission. If the signed link works while you are signed in, and the same file is not reachable at a plain public address, storage is behaving as documented.

What to tell the person filling the Form

Label the question with the format and the count, not just the word Upload: “Up to three photos (JPEG, PNG, WebP or GIF)”. A Submitter reads the label before choosing a file, and a correct hint is better than a refusal afterwards.

Say what happens to the file as well. Someone handing over a photograph is entitled to know that it is stored privately and opened through a link, not published on a page.

The request shape for a multipart Submission, including the file part, is in the API reference. Uploads arrived with the first Release — v1.0.0 in the Changelog lists them beside exports and answer summaries.