splitforms.com

Feature · File Uploads

Form file uploads — accept resumes, screenshots, and PDFs in any HTML form

Add multipart/form-data and a file input. With Storage connected, splitforms stores the upload and links it from the notification email, dashboard, and webhook payload.

  • 500 free / mo
  • No credit card
  • 30-sec setup
splitforms file uploads — Add multipart/form-data and a file input. With Storage connected, splitforms stores the upload and links it from the notification email, dashboard, and webhook payload.

No backend to build

Your form posts to one splitforms endpoint — no server, API route, or SDK. splitforms is the backend.

Straight to your dashboard

Every submission is saved to a searchable dashboard and emailed to you — spam filtered before it lands.

File Uploads, built in

No glue code, no third-party middleman — it ships as part of splitforms and works from your first submission.

Copy-paste ready

Drop this into any project.

Replace YOUR_ACCESS_KEY with the key from your splitforms dashboard. No SDK to install, no build step — the same html you already write.

Generate access key
file-uploads.html
<!--
  enctype="multipart/form-data" is REQUIRED for file uploads.
  Without it, browsers silently strip files from the POST body.
  Current limit: 5 files per submission, 5 MB per file.
  Storage integration must be connected before files are retained.
-->
<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="text"  name="name"  placeholder="Your name" required />
  <input type="email" name="email" placeholder="Email"     required />

  <label>
    Resume (PDF, DOCX, max 5 MB)
    <input
      type="file"
      name="resume"
      accept=".pdf,.doc,.docx,application/pdf"
      required
    />
  </label>

  <label>
    Portfolio screenshots (multiple allowed)
    <input type="file" name="portfolio" accept="image/*" multiple />
  </label>

  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />

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

<!--
  React / fetch equivalent:

  const fd = new FormData(formEl);                         // collects files too
  fd.append("access_key", "YOUR_ACCESS_KEY");
  const res = await fetch("https://splitforms.com/api/submit", {
    method: "POST",
    body: fd,                                              // do NOT set Content-Type
  });
  // 413 Payload Too Large = file exceeded the current upload limit.
  // 415 Unsupported Media Type = blocked extension (.exe, .js, etc.).
-->

How to set it up

How to set up File Uploads.

How file uploads flows through splitforms — what you do, what we do, and what lands in your inbox.

Set enctype on your form (this is the #1 forgotten step)

Add enctype="multipart/form-data" to the <form> tag. Without it, browsers silently strip files from the POST body — the form will submit but no attachment ever arrives. For React/SPA submissions via fetch, build a FormData object and pass it as the body; do NOT set Content-Type yourself, the browser sets the multipart boundary.

Add a file input (single, multi-select, or restricted by type)

Use a normal <input type="file" name="resume">. Add the 'multiple' attribute for multi-select. Use the 'accept' attribute to filter by extension or MIME type (accept='.pdf,.docx,application/pdf,image/*'). For best UX, also wrap the input in a <label> so the click target is the visible button, not the small native control.

Read attachments from the email, dashboard, or webhook payload

With Storage connected, uploaded files are saved privately and exposed through signed download links. Webhook payloads can include a 'files' array with stored-file metadata, so your own backend can copy the files into S3, R2, Google Drive, a CRM, or a ticketing tool if you need long-term storage.

How file uploads works

How does splitforms handle File Uploads?

splitforms accepts file uploads in any HTML form — set the form's enctype to multipart/form-data, add an <input type='file'>, and you're done. The same submit endpoint handles the multipart request, so there is no client-side S3 signing flow or separate upload endpoint to maintain. Route the same submission to an email inbox or a webhook at the same time — nothing here is one-or-the-other.

  • Standard HTML <input type="file"> — no JavaScript required, no client-side SDK
  • Current limit: up to 5 files per submission, 5 MB per file
  • Storage integration keeps text submissions working even when files are not retained
splitforms file uploads in action

What you get

What do you get with File Uploads?

Every reason below is the boring, reliable kind — the fundamentals of file uploads, built once and tested in production so you never have to.

  • Signed download links in notification and webhook workflows after Storage is connected
  • Private object storage with expiring signed links
  • Server-side checks block executable/script-like extensions and sniff content type
Why teams pick splitforms for file uploads

How SplitForms works

From form to workflow in 3 simple steps.

Connect your form, collect every submission, and send data where it needs to go — without building backend infrastructure.

A SplitForms contact form submission launching straight to your inbox

Add your endpoint

Point your form to your unique SplitForms endpoint. That's it.

HTML form pointing at a SplitForms submit endpoint

Receive submissions

We instantly capture and organize every submission in your inbox.

Submissions inbox with searchable leads and status pills

Route anywhere

Send data to email, spreadsheets, CRMs, webhooks, and 7,000+ apps.

Generic integration tiles for email, sheets, chat, CRM, automate, and webhook

No credit card required. Set up in under 60 seconds.

Connect & automate

Connect your favorite tools and automate everything

SplitForms works with the destinations you route to and the platforms you build on — from Slack and Sheets to WordPress, Shopify, and Next.js.

Connect your SplitForms form to Slack, Google Sheets, Mailchimp, Zapier and more

Trusted by indie teams and agencies shipping forms worldwide

PETAL/COKRAFT.DELINEAR-XBUILD.DEVSTUDIO 71MERIDIANFRAME&CO

Testimonials

Loved by developers shipping at every scale.

40 quotes on record — from indie hacks to agency migrations.

Common questions

File Uploads questions.

View all FAQs
How does form file upload work in splitforms and what's the maximum size?

Add enctype='multipart/form-data' to your <form> and an <input type='file' name='resume'>. The browser submits the file as part of the multipart POST; splitforms reads it through the normal submit endpoint and stores it when the Storage integration is connected. The current limit is 5 files per submission, 5 MB per file.

What plan includes file upload retention?

Retained file uploads unlock on Pro ($5/month) and above when the Storage integration is connected in the dashboard. Text-only submissions continue to work without Storage. For uploads, plan around the current product limit: 5 files per submission at 5 MB each.

How do I enable file uploads and restrict the file types?

Two steps: (1) connect Storage in the splitforms dashboard; (2) on your <form> tag, set enctype='multipart/form-data' and add an <input type='file' name='whatever' accept='.pdf,.docx,image/*'>. The accept attribute filters the OS file picker but is not a security boundary. To allow multiple files in one input add the multiple attribute. To require a file, add required. Executables and script-like extensions are blocked server-side regardless of accept.

Does file upload work with React, Next.js, Vue, or fetch()?

Yes. Build a FormData object from your form ref or manually append fields, append the access_key, and POST it: const fd = new FormData(formRef.current); fd.append('access_key', 'YOUR_ACCESS_KEY'); await fetch('https://splitforms.com/api/submit', { method: 'POST', body: fd }). Critical: do not set the Content-Type header yourself when sending FormData — the browser must set the multipart boundary.

Where are uploaded files stored, are they scanned for malware, and how do I get them out?

When Storage is connected, files are stored privately and exposed through signed download URLs. The current signed-link window is 7 days. To pull files into your own storage permanently, subscribe a webhook, read the files array from the payload, and copy each stored-file URL or key into S3, R2, GCS, Google Drive, or your CRM.

Simple pricing

Start free. Scale when you need more.

Choose a plan that fits your workflow — from a free form endpoint to full automations, exports, and higher submission limits.

Free

$0

Free forever

 
Best for testing

For side projects and indie devs.

  • 500 submissions / mo
  • Unlimited forms
  • Email notifications included
  • Honeypot spam filtering
  • Submissions dashboard
  • MCP setup stays free
  • No credit card required

3-Year

$59/ 36 months
was $99 · save 40% · new-user price

Pay $59. 3 years sorted.

  • 15,000 submissions / mo
  • Unlimited forms
  • Everything in Pro
  • Renews every 3 years
  • Long-term discount
  • Priority support included
  • Vote on the roadmap

No credit card required on Free • Cancel anytime