Batch File Upload
3 min read
The user picks twelve files and clicks Upload. The wall-clock time crosses ten seconds easily — past the unit-task boundary, the user is going to disengage if the perception layer does not earn its keep. The pattern stack is bigger than the single-file case, but the principles are the same.
This scenario sits in the 10 S+ band. The perception layer carries it through the time-aware feedback progression: per-file determinate progress, aggregate progress at the top, engagement cue past the 10 s boundary, background sync option for the long tail. Myers 1985 Myers 1985 covers the per-file determinate signal; Block & Zakay 1997 Block & Zakay 1997 covers the engagement trade past 10 s; Doherty 1982 Doherty 1982 is the background-sync rationale.
Determinate Progress Bar + Percentage Count
Upload a 4.2 MB file. Naive: generic spinner with no progress signal. Tuned: optimistic filename render, determinate progress bar, success affordance with checkmark.
Off
On
What is happening
The single-file demo stands in. For a real batch, the tuned UI stacks:
- Per-file rows — name, size, individual progress bar. The user sees the entire queue at once.
- Aggregate progress at the top — total bytes transferred over total bytes queued. Determinate.
- Engaging affordance past 10 s — the active queue, the upload speed, the estimated time remaining. The user has something to read while they wait.
- "Do this in the background and notify me" option for very long batches — defer off the user's perceived path entirely via background sync.
- Cancellation per file and per batch — the user can drop individual transfers without aborting the whole queue.
What to tune
- Pre-action — file rows render immediately (name, size, queued state) before any bytes transfer.
- First 1 s — per-file progress bars start filling. Aggregate bar at the top tracks total bytes transferred / queued.
- 1 – 10 s — bars run in parallel (4–8 concurrent transfers). Cancellation visible per file and per batch.
- Past 10 s — active-queue display: upload speed, estimated time remaining, files in flight. "Notify me when done" appears.
- Completion — each file flips to a checkmark + metadata. Final summary row; never silent.
When perceived performance hurts you here
Batch uploads have the same trap engaging loading does — a 60-second batch with rich engagement feels short while it runs and long in retrospect. For users who upload batches multiple times per session, the retrospective cost compounds.
The cleaner answer: lean on per-file determinate progress (the user learns what's happening), aggregate progress for orientation, and background sync past the 30 s mark so the user can leave the surface. Skip the motivational quotes — the queue itself is engaging enough.
The other failure: serialising the uploads when they could be parallel. A batch UI that processes one file at a time triples the apparent duration; for small files the bottleneck is connection round-trips, not bandwidth. Parallelise to ~4–8 concurrent uploads where the network supports it.
Accessibility
- Per-file
aria-busyflags so screen readers can navigate to active items. - Aggregate
role="progressbar"at the top of the queue. - Polite live region for batch-level state changes ("3 of 12 complete") — every minute or two, not every file.
- Cancellation must be keyboard-reachable for each file and for the batch.
- Don't trap focus on the queue — the user might want to navigate elsewhere while it runs.
Other patterns that fit
Same band, same surface — switch in whichever maps best to your UI.
Backwards-decelerating Progress Bar
Two bars, same actual duration. Naive: linear fill from 0 → 100 %. Tuned: same fill, but eased to be fast at the start and slow as it approaches the end, with backwards-moving ribbed pattern overlaid. Harrison et al. 2010 measured ~11–12 % perceived speed-up vs. linear at the same real wall-clock time. Free perception with no engineering cost.
Off
Press Run to start
On
Press Run to start
Rotating Tips
Engaging copy during a long wait. Naive: a static "Loading…" line for the full duration; the user has nothing to do but stare. Tuned: a "Did you know?" card cycles through a handful of perception facts every ~2.5 s with a soft cross-fade. Same wait — but the time fills with information instead of absence.
Off
Press Run to start
On
Press Run to start
Put into Background + Success Message
Past the 10-second wall, foreground waiting is the wrong unit. Naive: spinner blocks the panel; the user must keep watching. Tuned: a "Run in background" affordance demotes the wait to a small corner indicator and surfaces a toast when the work lands. Foreground attention is freed; the result still arrives loudly.
Off
Press Run to start
On
Press Run to start
Entertainment Loader
T-Rex Run-style mini-game during a long wait. Naive: a spinner for the full duration. Tuned: a clickable runner game — press Jump to leap over incoming mushrooms. The wait stops being time the user is paying and becomes time they are spending. Block & Zakay 1997: filled time has shorter retrospective duration than empty time.
Off
Press Run to start
On
Press Run to start
References · 3
- Myers 1985
Myers, B. A. (1985). The importance of percent-done progress indicators for computer-human interfaces. Proceedings of CHI '85, 11–17. Per-file determinate progress beats per-batch generic feedback.
- Block & Zakay 1997
Block, R. A., & Zakay, D. (1997). Prospective and retrospective duration judgments: A meta-analytic review. Psychonomic Bulletin & Review, 4(2), 184–197. The trade-off engagement makes during long batch uploads.
- Doherty 1982
Doherty, W. J., & Thadani, A. J. (1982). The Economic Value of Rapid Response Time. IBM Technical Report GE20-0752-0. Background sync moves the wait off the user's perceived path entirely for batch uploads.