splitforms.com
← Back to the journal

FormSubmit File Uploads: How Attachments Work (and Their Limits)

Yes, FormSubmit.co supports file attachments: set enctype="multipart/form-data" and add a file input. Files are emailed (10 MB total) but never stored.…

Start free — 500 submissionsSee pricing →No card, no time limit. Pro is $5/mo.
FormSubmit File Uploads: How Attachments Work (and Their Limits) article cover
Short answer
Yes, FormSubmit.co supports file attachments. Add enctype="multipart/form-data" to your <form>, keep method="POST", and add a named <input type="file">. Files are emailed with the submission, up to 10 MB combined, and FormSubmit doesn't store them afterwards. If you need to find an upload again later, use a backend that stores files.
Try it on your own form

Point any HTML form at one endpoint. 500 free submissions — no card, no time limit — and unlimited forms.

Create free account

Does FormSubmit support file attachments?

Yes. FormSubmit.co accepts file uploads natively: set enctype="multipart/form-data" on a form that POSTs to https://formsubmit.co/[email protected] and add an <input type="file"> with a name. The file arrives as an attachment on the submission email. You can use several file inputs, but together the files must stay under 10 MB, and FormSubmit doesn't keep them after sending (FormSubmit documentation, checked October 10, 2026).

That's the whole feature. There's no attachment-specific option, no _attachment field, and no setting to change the limit. Everything below covers the markup that works, what the docs do and don't say, and the five ways uploads usually go wrong.

A working FormSubmit file upload form

This is FormSubmit's own documented pattern with a few optional fields added. Replace the email address and you can paste it into any static page:

<form action="https://formsubmit.co/[email protected]"
      method="POST"
      enctype="multipart/form-data">
  <input type="email" name="email" placeholder="Your email" required>
  <textarea name="message" placeholder="Details"></textarea>

  <!-- the file input needs a name, or nothing is sent -->
  <input type="file" name="attachment" accept="image/png, image/jpeg">

  <!-- optional FormSubmit fields -->
  <input type="hidden" name="_subject" value="New upload from the site">
  <input type="hidden" name="_next" value="https://yourdomain.com/thanks.html">

  <button type="submit">Send</button>
</form>

What each piece does:

  • enctype="multipart/form-data" is the only attachment-specific requirement. HTML forms default to URL-encoding, which sends the file's name, not its bytes.
  • method="POST" is required: every FormSubmit example uses it, and a file can't travel in a GET URL anyway.
  • name="attachment" is just the name FormSubmit's example uses. Any name works, as long as there is one: FormSubmit's help page says fields without a name attribute aren't included in the email.
  • accept only filters the visitor's file picker. It isn't validation, and FormSubmit doesn't document any server-side file type rules.
  • _next must be a full URL including https://. FormSubmit's help page traces the "make sure your form has the method=POST attribute" error to a _next value that was a path instead of a URL.

Leave reCAPTCHA on (don't add _captcha=false) unless you have a reason: FormSubmit's docs say it may apply "technical limitations" to forms without it. If you'd rather not publish your address in the action, FormSubmit sends you a random string to use instead once you confirm your email.

FormSubmit attachment limits: what the docs say (and don't)

Every row below was checked on formsubmit.co on October 10, 2026. Where the docs are silent, the table says so instead of guessing.

QuestionWhat FormSubmit documents
Size limit10 MB combined across all file inputs in one submission. It was 5 MB until early 2026 (web.archive.org snapshots of October 30, 2025 and February 21, 2026).
Per-file limitNot stated; only the 10 MB total is documented.
Number of files"Several file input fields" are allowed. A single input with the multiple attribute isn't mentioned.
Allowed file typesNot stated. The example only uses accept="image/png, image/jpeg" in the picker.
StorageFiles aren't retained and can't be accessed through the API. Text submissions are kept for 30 days.
WebhooksThe sample webhook payload shows text fields only; files in webhooks aren't documented.
PlansFree, no registration, unlimited forms and submissions. No paid plan is listed anywhere on the site.

Two practical consequences. First, because 10 MB is a total, a form with three file inputs gives each visitor about 3 MB per file if they fill all three. Second, your own mailbox applies its own message-size limit on top of FormSubmit's, so test with a file close to the limit before you rely on it.

Why FormSubmit attachments don't arrive: 6 failure modes

1. You're submitting through the AJAX endpoint

FormSubmit's AJAX endpoint is https://formsubmit.co/ajax/[email protected], and every example on its AJAX page (fetch, Axios, jQuery) sends a JSON body. JSON can't carry a file's bytes, and the docs don't say whether the AJAX endpoint accepts a multipart FormData body. The documented path for files is the normal form POST shown above. If you must stay on the page, test a FormData request yourself with a real file before shipping, and note that FormSubmit's autoresponse feature doesn't work with AJAX submissions either.

2. The enctype is missing or misspelled

Without enctype="multipart/form-data" the browser sends something like attachment=resume.pdf. The email arrives, the field shows the filename, and there's no attachment. It's the most common upload bug on any form backend, and the fix is one attribute.

3. The files add up to more than 10 MB

Phone photos and scanned PDFs pass 10 MB quickly, especially with several inputs. The docs don't describe what visitors see when they go over, so add a size check in the browser (read input.files[i].size before submit) and say the limit next to the input.

4. The upload came in before you confirmed the form

The first submission to a new address triggers a confirmation email. FormSubmit's help page says submissions made before you confirm are delivered once you do, but uploaded files from that period aren't kept. Confirm the form with a test submission before you publish it.

5. The email went to spam

FormSubmit's own help page tells you to check your spam folder, "especially if you are receiving a lot of them", and to mark the messages as not spam. Since FormSubmit doesn't keep the file, a spam-foldered upload you delete is gone. More on why form emails get filtered in why contact form emails go to spam.

6. You're testing from a local file

Opening the page as file:///…/contact.html produces FormSubmit's "Unable to submit form" error. Serve the page from a web server, or add a hidden _url field with the page's real URL, as the help page suggests.

When you need uploads stored, not just emailed

FormSubmit's model is email-only for files: the attachment is the only copy. That's fine for an occasional screenshot. It isn't fine for resumes, signed documents, warranty receipts or anything you'll need to find again after the email has been archived, forwarded or deleted. At that point you want a form backend that saves the file with the submission.

The splitforms version of the same form uses the same enctype and file input, with an access key in place of the email address:

<form action="https://splitforms.com/api/submit"
      method="POST"
      enctype="multipart/form-data">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
  <input type="email" name="email" required>
  <textarea name="message"></textarea>
  <input type="file" name="attachment" accept=".pdf,image/*" multiple>
  <button type="submit">Send</button>
</form>

To submit with JavaScript instead, post a FormData body and let the browser set the Content-Type header. Setting it yourself drops the multipart boundary, and a JSON body can't carry files:

const form = document.querySelector("form");
form.addEventListener("submit", async (e) => {
  e.preventDefault();
  const res = await fetch("https://splitforms.com/api/submit", {
    method: "POST",
    headers: { Accept: "application/json" }, // no Content-Type here
    body: new FormData(form),
  });
  console.log(await res.json());
});

How uploads work on splitforms (verified against the code that runs the submit endpoint):

  • Limits: up to 5 files per submission, 5 MB each. A file over 5 MB isn't stored, and a request body larger than five 5 MB files plus the form fields returns 413 payload_too_large.
  • Plans: uploads need a paid plan with the Storage integration connected in the dashboard. On the Free plan (500 submissions total) the text fields are still saved and the JSON response notes that the files were dropped.
  • Storage space: files count toward your plan's storage, 500 MB on Pro ($5/month) and 5 GB on Annual ($49/year). Stored files stay with their submission until you delete it; if an account drops back to Free, its files are removed after 30 days.
  • Email: the notification email lists every file with a download link that lasts 7 days, and when the files total 7 MB or less they're attached to the email too.
  • Dashboard and webhooks: each submission links its files in the dashboard, and webhook payloads include a files array with pre-signed download URLs so your own backend can copy them.
  • Safety checks: executable and script extensions (.exe, .js, .sh and similar) are rejected, and the stored content type is sniffed from the file's bytes rather than trusted from the browser.

Notification email itself is free on every splitforms plan. For the full walkthrough of multipart forms, drag-and-drop and validation, see how to add file uploads to a contact form, or the file uploads feature page. If your site is on GitHub Pages, Netlify or another static host, static site file upload forms covers that setup.

FormSubmit or a storing backend?

FormSubmitsplitforms
Cost of uploadsFreePaid plans: Pro $5/month, Annual $49/year
Size limit10 MB total per submission5 files of 5 MB each
How files reach youEmail attachment onlyEmail links (attached when 7 MB or less), dashboard, webhooks
Files kept afterwardsNoYes, until you delete the submission
SignupNone (confirm by email)Account and access key

Pick FormSubmit when uploads are occasional, small, and an email is enough of a record. Pick a storing backend when a lost email would mean a lost file. For everything else that differs between the two (dashboard, spam filtering, history, migration steps), read the full FormSubmit alternative comparison, and see splitforms pricing for plan details.

Sources

FormSubmit claims were checked on October 10, 2026 against FormSubmit's own pages:

splitforms limits and plan details come from the splitforms docs and pricing page.

FAQ

Does FormSubmit.co support file attachments?

Yes. FormSubmit documents native file uploads: add enctype="multipart/form-data" to a form that posts to https://formsubmit.co/[email protected] and include an <input type="file"> with a name attribute. The file arrives attached to the submission email. You can use several file inputs, but the combined size must stay under 10 MB.

What is FormSubmit's file attachment size limit?

10 MB in total per submission, across all file inputs, according to formsubmit.co/documentation. The limit used to be 5 MB: the web.archive.org snapshot of the documentation from October 30, 2025 says 5 MB, and the February 21, 2026 snapshot says 10 MB. FormSubmit doesn't document a per-file limit or a list of allowed file types.

Can I upload files through FormSubmit's AJAX endpoint?

FormSubmit doesn't document it. Its AJAX examples (fetch, Axios and jQuery against https://formsubmit.co/ajax/[email protected]) all send JSON, and JSON can't carry file bytes. If you need attachments, use a normal multipart POST, which is what the file upload docs show, or test a FormData request against the AJAX endpoint yourself before relying on it.

Is FormSubmit free?

Yes. FormSubmit describes setup as free with no registration, and its documentation promises unlimited forms and submissions. Its website doesn't list any paid plan, so there's nothing to upgrade to if you need longer history or file storage.

Does FormSubmit keep uploaded files?

No. FormSubmit keeps submissions for 30 days and lets you read them through its API up to 5 times a day, but its documentation says uploaded files aren't retained and can't be accessed through the API. If the email is lost, so is the file.

How do I keep uploaded files after the email is sent?

Use a form backend that stores uploads. On splitforms, paid plans with the Storage integration connected keep up to 5 files of 5 MB each per submission, with links in the dashboard, the notification email and webhook payloads. Pro is $5/month with 500 MB of file storage; Annual is $49/year with 5 GB.

Need uploads you can find again? Point your form at https://splitforms.com/api/submit, connect Storage, and every file is saved with its submission. Get a free access key.

Related articles

More practical guidance from tutorials.

Browse the journal →
Tutorials

React Hook Form + Zod: Schema Validation Step by Step (2026)

Wire Zod into React Hook Form with zodResolver: install, define a schema, infer types, show…

10 min readRead →
Tutorials

React Hook Form reset(): Clear, Reset and Repopulate a Form

How reset() works in React Hook Form: clearing after submit, resetting to new default values…

8 min readRead →
Tutorials

React Hook Form useFieldArray: Dynamic Fields Guide (2026)

Build add/remove field lists with useFieldArray: append, remove, move, keys, validation per…

10 min readRead →

Explore this topic

Start with the overview, then move into focused guides.

OverviewContact Forms for Every FrameworkStart here →GuideContact Form for Next.jsRead →GuideContact Form for ReactRead →GuideContact Form for VueRead →ReferenceContact form guideOpen →

Building forms with ChatGPT, Claude, Cursor, or v0? Connect the native MCP server and give your agent a production form backend.

Explore the MCP server →

Give your form a production backend.

One endpoint adds delivery, spam filtering, storage, and integrations. Start with 500 free submissions — no card, no time limit.

Create free accountRead the docs →
Secure checkoutSSL encryptionPrivacyProtected
VISAAMERICANEXPRESSstripe