Works with any backend npm install Zero dependencies

Chunk Retry

Auto-retry failed chunks with retries: 3. If a chunk fails to upload, the uploader automatically retries up to the configured number of times before reporting an error.

new MultipleUpload(document.getElementById('demo-chunk-retry'), {
 uploadUrl: '/api/upload',
 multiple: true,
 chunked: true,
 chunkSize: 1 * 1024 * 1024,
 retries: 3,
 onTaskError: function(task, error) {
 var log = document.getElementById('retry-log');
 log.innerHTML += '<div>Error on ' + task.fileName + ': ' + error + '</div>';
 log.scrollTop = log.scrollHeight;
 },
 onTaskComplete: function(task) {
 var log = document.getElementById('retry-log');
 log.innerHTML += '<div style="color:#16a34a">' + task.fileName + ' completed</div>';
 }
});

Retrying one chunk, not the file

This is the practical reason chunked uploads win on unreliable networks. A failure costs one chunk, and the retry re-sends only that chunk — where a single-request upload would start the whole file again, which on a bad connection often means never finishing at all.

Where the ceiling actually is

With per-chunk retries a 4 GB upload over flaky mobile becomes a question of patience rather than luck. The limit stops being the length of the longest uninterrupted connection and becomes whether the user leaves the page — which is what persistState then addresses.