Skip to content

Uploading documents customers will get wrong

  • Home
  • Blog
  • Uploading documents customers will get wrong
Uploading documents customers will get wrong

Customers get document uploads wrong because most flows assume a desktop, a scanner and a fast link. Phones save HEIC photos, limits hide until upload time, and "Invalid file" explains nothing. Fixing document upload user errors is less about stricter validation and more about catching each mistake where it's cheapest — on the device, before the upload starts.

Key Takeaways

  • Most document upload user errors come from defaults: phone cameras, HEIC photos, hidden size caps and vague "Invalid file" messages.
  • Catch each error as early as possible — on the device, before the upload starts. Every later checkpoint costs more.
  • State the rules (formats and size limit) before the picker opens; never let customers discover them by failing.
  • Keep limits consistent across layers: NGINX rejects bodies over 1 MiB by default, and PHP silently empties requests past post_max_size.
  • Re-validate server-side: real file type from content, real size, a malware scan, and storage outside the web root.
  • Give every rejection a reason code and a named fix; vague errors push customers into email support loops.
  • Documents are personal data: collect only what the workflow needs, and keep a retention policy you actually follow.
Document upload flow checkpoints from file pick to storageFour checkpoints in a document upload flow: choosing the file, on-device checks, upload with progress, and server validation and storage.Where an upload is caught or lostThe same mistake gets more expensive at every stage it survives.1Choosethe filepicker or camera2Check iton the devicetype, size, pages3Upload withprogressretry on bad links4Server checksand storespreview and replace
Checkpoints in a document upload flow, from the file picker through on-device validation to server-side checks and confirmed storage.

Why do customers get document uploads wrong?

Because most flows assume a desktop, a scanner and a patient customer. A phone photographs a certificate, saves it as HEIC or a multi-megabyte JPEG, and the portal rejects it after a full upload with the words "Invalid file". Document upload user errors come from defaults, not carelessness.

Four defaults do most of the damage. Pickers on phones open the gallery or the Files app depending on the accepted types, and customers get lost in their own camera roll. iPhones have saved photos as HEIC by default since iOS 11, and plenty of downstream tooling still won't open it. Scans arrive password-protected or corrupted. And size limits are usually enforced at the end of the upload, so the customer pays for the transfer before learning the rules existed.

Common document upload errors and the fix that prevents each oneRows mapping the four most common customer upload errors to the design fix that prevents them.Which error maps to which fixWrong formatDeclare PDF, JPEG or PNG up front; enforce with acceptFile too largeCheck size on the device and show the limit before uploadBlurry photoShow a preview after capture with an obvious retake buttonPage mix-upsOne file per document; show what you already holdEvery fix runs before or during the upload — never only after it fails.
How the four most common document upload errors map to the design fix that prevents each one before the upload starts.

What does each rejected upload actually cost you?

Every rejection buys a support ticket or an abandoned application. Staff re-request the file by email, wait, re-check and re-file it, and the customer's onboarding stalls for days. One bad limit quietly turns a five-minute form into a week-long exchange across three channels.

The pattern repeats. A customer hit with "Invalid file" retries blind, fails again, then emails the document to whoever they can find. Someone on your side downloads it, renames it, compresses it and uploads it themselves — unpaid processing work, repeated per customer. Meanwhile the number you care about, applications completed, drops for a reason nobody logged.

Timeline of what the same upload mistake costs at each stageA timeline showing the cost of a document upload error caught at file pick, before upload, after upload and at a support ticket.Catch the error early or pay for it laterAt file pickseconds;customer self-fixesBefore uploadseconds;app blocks and explainsAfter uploadminutes;a full retry uploadSupport ticketdays;staff hours, lost trustCost of the same mistake, left to right.
A timeline of what the same document upload mistake costs, from seconds at the file picker to days of staff time once it becomes a support ticket.

When does an upload flow need hardening — and when is a plain form enough?

Harden the flow when documents gate a workflow: customer onboarding, claims, loan files, admissions, HR paperwork. A one-off attachment to a monitored inbox can stay simple. The honest test is volume times consequence: the more customers pass through each week, and the longer a rejection stalls each one, the more the flow must absorb.

In Nepal most customers arrive on a phone over a patchy data connection, which raises the stakes: transfers take longer, networks drop mid-upload, and a retry has to be cheap. If you're still weighing whether a portal is worth building at all, start with the business case for a customer portal, then design the upload path second.

How do you build an upload flow that survives real customers?

Build the checks in the order the customer meets them: device first, server last. Declare the accepted formats before the picker opens, check size and type on the device, upload with visible progress, then re-validate everything server-side and show a preview the customer confirms. Each checkpoint removes a whole class of error.

  1. Pick the smallest format set that works — PDF plus JPEG and PNG covers nearly every document. Declare it in the markup with the accept attribute and repeat it as plain text above the picker. Accept is a hint, not enforcement.
  2. Check before you send. The browser's File API gives you file.size and file.type; block oversize or wrong-type files instantly, with a message that names the fix:
    input.addEventListener('change', () => {
      const file = input.files[0];
      if (file && file.size > 15 * 1024 * 1024) {
        // show the limit and stop here — before a byte moves
      }
    });
  3. Accept phone photos instead of demanding scans, and downscale images with an image library before storage. Never make customers install tools to please your validator.
  4. Upload with feedback: a progress bar, honest failure handling and automatic retry for dropped connections. For big files on mobile links, chunk the upload so a failure resumes instead of restarting.
  5. Re-validate on the server: real size, real type read from the file's contents — never the filename or extension — and a malware scan before storage.
  6. Show what you stored. Preview the document and let the customer replace or delete it until the step is submitted. Name stored files randomly so paths can't be guessed.
  7. Log every acceptance and rejection with a reason code, so a week of traffic tells you the top cause — and you fix that first.

None of this needs exotic tooling; it's ordinary craft for a team that builds portals and internal systems for a living.

Which limits and settings actually matter?

Set one size ceiling and apply it at every layer, because each layer enforces its own. NGINX rejects request bodies over 1 MiB by default with a 413; PHP empties $_POST and $_FILES when a body exceeds post_max_size. Your form's idea of the limit means nothing until these agree.

# NGINX: reject oversize bodies before they reach PHP
client_max_body_size 25m;

# php.ini: post_max_size should sit at or above upload_max_filesize
upload_max_filesize = 25M
post_max_size = 26M

These are live server settings: run nginx -t before you reload, and change them in a quiet window. Type rules belong in the application:

$request->validate([
    'document' => 'required|file|mimes:pdf,jpeg,png|max:20480', // 20 MB
]);

How do you verify the flow works before launch?

Test with the devices your customers hold, not just your laptop. Upload an iPhone photo in HEIC, an Android camera shot, a 300 dpi scan, a password-protected PDF and a deliberately wrong file. Throttle the network, kill the tab mid-upload, then confirm every rejection names its fix.

  • A photo taken from inside the flow, using the camera input.
  • A real scan from a local photocopy shop — they behave nothing like laser prints.
  • Zero-byte and renamed files, which only server-side checks will catch.
  • A slow-network run: does a dropped upload resume, or restart from scratch?
  • Rejection reasons in the logs — if "file too large" tops the list, your limit is wrong, not your customers.

Track two numbers from day one: uploads started and uploads completed. The gap is your error rate, and the reason codes tell you why.

Why do uploads fail silently in production?

Most silent failures live between layers, where one component's limit is another's assumption. NGINX returns 413 before PHP ever runs; PHP quietly empties the request when post_max_size is exceeded; a gateway timeout kills long uploads on slow links. Debug in order: browser status code, web-server error log, then application and storage logs.

  • 413 in the browser's network tab — a proxy body-size limit; raise client_max_body_size, test, reload.
  • An empty $_FILES with no error — PHP dropped a body over post_max_size; check the server log, not the form.
  • Uploads dying around a minute — a gateway or FastCGI timeout; slow links need more time or resumable chunks.
  • Stored files that won't display later — usually HEIC or a mislabelled extension; convert at intake instead.
  • Intermittent mobile failures — the network switched mid-transfer; retry logic and chunking are the cure.

What does storing customer documents cost to run?

Storing files is cheap per gigabyte; the running cost hides in retention, backups nobody reviews and staff repeatedly downloading copies. Cold storage classes charge to retrieve, and egress mounts up. Review retention yearly, delete what the workflow no longer needs, and confirm current figures with your provider's own calculator.

Documents kept "just in case" are the worst line item: they cost storage, they widen your data-protection exposure, and they never pay for themselves. An annual retention pass is an afternoon's work that keeps both bills and risk flat.

How do you keep uploaded documents secure?

Treat every upload as untrusted input and as personal data. Re-check the real file type server-side, scan for malware, store files outside the web root or in private object storage, encrypt at rest, log who views what, and keep a written retention policy. Never collect a document the workflow doesn't need.

Identity documents are exactly what an attacker wants, so access control matters as much as intake: staff should see a file only when a task requires it, and every view should leave a trace. Two habits keep this honest — collecting only the customer data a process genuinely uses, and knowing where customer data actually lives across your hosting, backups and third-party tools.

Which upload mistakes do we keep fixing?

These five account for most of the upload pain we inherit. Each passes local testing because the tester uses a laptop, a fast link and a well-behaved PDF. All are cheap to fix before launch and expensive once customers have learned to email instead.

  • Guessing limits instead of checking what real devices produce — a phone photo is a few megabytes untouched.
  • Validating size only after the upload finishes, so the customer pays for the transfer to learn the rule.
  • One error message for every failure, which forces customers to guess and retry blind.
  • No replace path, so re-submissions pile up as duplicates nobody can delete.
  • Testing only on desktop Chrome with tidy PDFs — the exact customers who never struggle.

What does a real failure and fix look like?

A composite from flows we've inherited: a lender's onboarding asked for a citizenship certificate, accepted only PDFs under 2 MB, and answered every failure with "Invalid file". Phone customers couldn't produce a valid file at all, so they emailed photos to a staff address — and staff uploaded them by hand.

Nothing was wrong with the validation itself; it aimed at the wrong customer. The rebuild took three changes: raise the ceiling and accept JPEG and PNG alongside PDF; downscale images before storage so phone photos fit; and rewrite every rejection to name the problem and the fix, with a reason code in the logs. Email submissions never vanished entirely, but they stopped being the main channel within a fortnight.

Which approach should you choose?

Match the machinery to the stakes. A plain form posting to your app handles low volumes well. Presigned URLs send the file straight from browser to object storage, so your servers never carry the bytes — AWS documents the browser-to-bucket flow. Verification services add fraud checks, at the price of a third party holding identity documents.

ApproachWhat it handlesWhere it breaksFits when
Plain multipart formSmall files straight into Laravel, Node or similarBig files tie up workers; retries restartLow volume, internal teams
Presigned upload to object storageDirect browser-to-bucket transfers; your servers skip the bytesNeeds careful expiry and access rulesCustomer portals, files over a few MB
Resumable or chunked uploadSlow mobile links; failures resume instead of restartingMore moving parts to host and monitorLarge documents, weak networks
Verification service (KYC)Fraud and authenticity checks on identity documentsA third party holds sensitive documents; per-check billingRegulated onboarding

Start with the plain form. Move to presigned or resumable uploads when files grow or links worsen. Reach for a verification service only when regulation or fraud risk demands it — the simpler option wins until volume says otherwise.

In short: state the rules before the picker opens, check on the device, re-check on the server, explain every rejection, and keep only the documents the workflow needs. Those habits remove most document upload user errors without exotic tooling — they're design decisions, not features.

People also search for

If your portal's upload step is leaking customers, or your team is still re-filing documents from email, our team can review the flow and rebuild it properly — you can see the kind of work we deliver in our portfolio. Tell us what's failing and we'll come back with a written plan, not a pitch.

Frequently asked questions

  • Most pickers open on "All files", so a .pages or .zip sits next to the .pdf they need. Narrow the picker with the accept attribute, label the field with the exact format and a sample, and state the reason. Server-side, still verify the type yourself, because accept is a hint, not a rule.

  • iPhones default to HEIC, which many PDF pipelines, older ImageMagick builds and document parsers cannot read. Either transcode on the server with libheif or ImageMagick, or accept it and convert before processing. Asking users to change the "Most Compatible" camera setting rarely works, because it is a per-device preference you cannot rely on.

  • When the POST body exceeds PHP's post_max_size, PHP discards the whole request, so the form arrives empty and validation fails everywhere at once. Nginx returns a 413 that the browser may barely surface. Log the response status and read $_FILES['error'] on the server; the code tells you whether the per-file or total limit was hit.

  • Set it from real documents: a modern phone photo is typically several megabytes and a 300 dpi scanned PDF larger. Show the limit in MB beside the field, check it in the browser too, and keep the client-side number in step with the server limit so customers never pass one gate and fail the other.

  • On PHP, run php -i and read upload_max_filesize and post_max_size; on Nginx, look for client_max_body_size, which defaults to 1 MB; on Apache, check LimitRequestBody. Defaults vary by version and SAPI, so confirm against your current vendor documentation. Verify by uploading a test file just over each limit and reading the response code rather than trusting config alone.

  • Never trust the browser-reported MIME type or the extension. Check the file signature (magic bytes) server-side, store files outside the web root under random names, disable script execution in the storage location, and scan with an antivirus such as ClamAV before the file is used. Serving downloads through an authenticated route rather than a public URL closes the remaining gap.

  • Large transfers die on flaky connections, and a standard form upload restarts from zero. Chunked or resumable uploads — the tus protocol, Uppy, or S3 multipart upload with per-part retries — let a dropped connection continue instead of failing. Add an honest progress indicator, then verify by killing your connection mid-transfer and confirming the upload resumes where it stopped.

  • Disable the submit control while the request is in flight, and send a client-generated idempotency key or unique name with each upload so the server can recognise a repeat. Deduplicate by checksum on arrival. Verify by double-clicking in a staging environment and confirming only one file lands in storage.

  • EXIF data survives the upload untouched and can expose a customer's home address when you re-serve the image. Re-encoding server-side strips it, but read the orientation tag first or photos will display sideways. Define retention too: delete or downscale originals you do not need, because stored originals are the version that leaks.

  • Log the server-side failure reason for every rejected or abandoned upload, and watch the funnel step in analytics: a drop-off spike or repeated retry loops points at size limits, timeouts or format rejections. Count support tickets about documents each month. The cost shows up as staff re-requesting files and customers giving up; our team can review the flow via /contact.

0 comments

Be the first to share your thoughts.

Leave a comment

Chat on WhatsApp