What breaks

Contact form 7 file upload not working: find it

The picker takes the photo, then the form refuses it or sends without it. Mimiq runs the form as a visitor and shows which message came back, but the photo itself you check on your own phone.

5 visitors try to .
First test free with an accountRun it from your coding agent

Why is my Contact Form 7 file upload not working for visitors?

An upload fails at one of four gates, and each leaves a different trace: the field's own size or file-type rule refuses the file with a message under the field, the server's upload limit refuses it before the plugin sees it, a phone photo in a format your list does not allow fails only on phones, or the file is accepted and never attached to the mail. A simulated visitor opens the same form, presses Send and reports the message the page showed, and whether it sent.

What this looks like in a report

Who
Dmitri, a homeowner sending photos of a leaking pipe to a plumber
How they arrived
Opened a plumber's site from a search on his iPhone
Where they stopped
Contact page, after choosing a photo from his camera roll

“The form took the photo and showed its file name. I pressed Send and the page stayed exactly the same. I did not know if the plumber had my photos, so I called the number at the top instead.”

The fix. Allow the photo type your visitors' phones send, or convert the photo on upload, and print the allowed types and the maximum size beside the field. Raise the server's upload limit to cover a full-size phone photo, and show an error under the field whenever a file is refused.

An illustration. Run a test to see your own.See a real sample report

The field takes the file, then refuses it or drops it without a word

An upload has more gates than a text field. The file has to pass the browser, the tag's size and type rules, the server's own upload limit and the mail step, and each gate fails differently. A server limit can reject a large file before Contact Form 7 runs, so the form may show nothing from the plugin at all. An owner who tests with a small PDF on a laptop never reaches the gates a phone photo hits. The owner who checks the mail finds the message and no file, and assumes the upload never happened.

  • Open the tag in the form editor and read its filetypes and limit options, then compare them with the photo's type and size.
  • Try a small PDF on a laptop first, then the same photo from a phone, one at a time.
  • Ask your host for the server's upload limit. A limit below your file size refuses the file early.
  • In the form's Mail tab, confirm the upload tag is in the attachments box, not only named in the body text.
  • After Send, read the console and the network tab. A failed upload request shows the status the server returned.

The four gates a file passes, in order

The browser reads the file first, and the form keeps its name on screen. That step only proves a file was picked. Next, the tag checks the size and type against its options, and a refused file usually shows a short message under the field, so the visitor can pick again. Then the server checks the upload against its own limit, which your host sets and which can be lower than the tag's. If the server refuses the file, the request can fail before Contact Form 7 writes any message.

The last gate is the mail. The plugin only attaches an uploaded file if the mail settings say to, and it cleans up the temporary copy afterwards. If the uploaded field is not listed there, the form can say the message was sent while your inbox receives the text without the file. Owners rarely look at this gate, because the confirmation looks the same either way.

Phone photos fail on a format the list never named

An iPhone saves photos as HEIC by default on many models, and an Android phone can send a file type the list does not name. If the tag allows only JPG, PNG and PDF, a photo taken on the phone is refused under the field. The owner who tests with a PDF on a laptop never meets that refusal. The visitor on a phone sees a message that looks like a broken form.

Size works the same way. A single phone photo can be larger than a small default limit, and the tag refuses it under the field even when the server would take it. Raise the limit in the tag only when you also raise the server limit, or the file fails one gate later with no message. The number that matters is the one your host enforces, not the one written on the form.

Find which gate refused the file

Start with what the visitor saw. A message under the field means the tag refused the file, and the message names the rule. No message and a page that did not change points at the server or the mail step, so open the console and the network tab. A failed request with an error status points at the server limit. A successful request followed by an email with no attachment points at the mail settings.

A simulated visitor opens the same form, fills in the text fields, presses Send and reports the reply status and whether the form said sent. It cannot pick a photo from your camera roll, so test the file gate by hand: send the same photo from your phone and write down the message it gives. The run cannot read the mail log or your inbox, so check the attachment in your inbox yourself.

What you get with Mimiq

  1. 01

    Run it by hand, or on every pull request

    Paste a link and a task in the app and watch the visitors work. Or run them on every preview deploy: the GitHub Action comments on the pull request, any other CI can call the MCP endpoint, and your coding agent can run it too.

  2. 02

    Bugs and usability problems in one report

    The browser records errors and failed or slow requests on the step they happened. The visitors say where the wording or the steps confused them, and where they left.

  3. 03

    Visitors that behave like your audience

    Each visitor is a different profile with a reason to be there, matched to who the page is for, described by you, or built from your own customers.

  4. 04

    A prompt to fix each problem

    Every problem comes with a fix to paste into Cursor, Claude Code, Lovable or any coding agent, and one prompt hands over the top problems at once. Then send the same visitors through again.

  5. 05

    Follow every visitor

    See each visitor's whole path, step by step with screenshots, and what it was thinking at every step. Ask any visitor a question.

The browser records relevant JavaScript errors and failed or slow app requests encountered during the run, attached to the step where they occurred. The visitors are simulated: they find problems, they do not predict how many real people will convert.

A server limit change or a new phone photo format can refuse files again

Hosts change upload limits and phone cameras change formats, so a form can refuse a photo after an update. Rerun the form after each change, then send the same small PDF and full-size phone photo by hand and check that the mail still carries the attachment. Owners behind a site password, or testing each preview deploy, repeat the run before a release.

Starter

Try it on one launch

$9 once
120 credits, never expire

About 4 tests of 5 visitors

  • Visitors on your landing page, signup and checkout
  • Where they left and why, with a fix to copy for each problem
  • Run it in the app or on every pull request
  • Ask any visitor a question, included
  • Test accounts and protected previews
Buy 120 credits

Builder

Test every build

$19 a month
500 credits every month

About 20 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Cancel anytime
Choose Builder

Pro

Test every release, as a team

$49 a month
1,500 credits every month

About 60 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Cancel anytime
Choose Pro

Scale

Test at scale, every day

$149 a month
6,000 credits every month

About 240 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Priority support
  • Cancel anytime
Choose Scale
$0for your first test, with a free account (Google sign-in, no card). It includes 50 credits, enough for 10 visitors. After that a visitor uses 5 credits, and packs start at $9 for 120 credits.
See a sample report

Questions

Why does the form accept the file but the email has no attachment?

The browser and the form accept the file before the mail step runs. If the mail settings do not attach the uploaded field, the message arrives with its text and no file. Open the form's Mail settings, find where the uploaded field is attached, and send one test message to your own inbox.

What file size limit should I allow?

Pick a limit that covers a full-size phone photo, and check it against your host's upload limit, which can be lower. A limit set too small refuses real files with a message. A limit above the host's can fail on the server with no message at all.

Can the run test my phone's photo?

Not the photo itself. The run fills in the form and reports the message the page shows after Send, but it cannot pick a photo from your camera roll. Test the exact photo that failed on your own phone before you call the fault fixed.

Does the test tell me how many visitors try to upload?

It does not predict how many visitors attach a file, or how many give up at the field. Those counts come from your analytics on the form page. The test shows the gate a file hit and the message it saw.

Keep reading

Send visitors and see what breaks first.

Your first test is free: sign in with Google and it starts right away. Last checked 2026-11-02.

5 visitors try to .