1 function showsize(bytes) {
2 return (bytes / 1024 / 1024).toFixed(2);
5 function trackupload(input) {
7 return true; // default form action
10 var progress = document.getElementById('progress');
12 progress = document.createElement('DIV');
13 progress.id = 'progress';
14 progress.textContent = '0%';
15 progress.style.width = '0';
16 var bar = document.createElement('DIV');
17 bar.className = 'bar';
18 bar.appendChild(progress);
19 input.parentNode.insertBefore(bar, input.nextSibling);
22 var ajax = new XMLHttpRequest();
23 ajax.upload.addEventListener('progress', function (e) {
24 var percent = (e.loaded / e.total) * 100;
25 progress.style.width = percent + '%';
26 progress.textContent = Math.floor(percent) + '%';
27 progress.innerHTML += ' <small>(' + showsize(e.loaded) + ' / ' + showsize(e.total) + ' MB)</small>';
29 ajax.addEventListener('load', function (e) {
30 if (e.target.status == 200) {
31 progress.textContent = 'voltooid';
32 progress.innerHTML += ' <small>(' + showsize(input.files[0].size) + ' MB)</small>';
33 window.location.assign(e.target.response);
36 progress.textContent = 'fout';
37 progress.innerHTML += ': <small>' + e.target.responseText + '</small>';
39 progress.style.width = '100%';
40 input.parentNode.removeChild(cancel);
42 ajax.addEventListener('error', function (e) {
43 progress.textContent = 'mislukt: ' + e.target.responseText;
45 ajax.addEventListener('abort', function (e) {
46 progress.textContent = 'afgebroken';
47 input.parentNode.removeChild(cancel);
48 input.parentNode.removeChild(progress.parentNode);
51 ajax.open('POST', input.form.action);
52 ajax.setRequestHeader('Accept', 'text/plain')
53 ajax.send(new FormData(input.form));
55 var cancel = document.createElement('BUTTON');
56 cancel.textContent = 'Afbreken';
57 cancel.onclick = function () { ajax.abort() };
58 cancel.style.float = 'left';
59 input.parentNode.insertBefore(cancel, progress.parentNode);
63 document.addEventListener('DOMContentLoaded', e => {
64 for (let row of document.forms[0].elements) {
65 if (row.type == 'file') {
66 row.form.onsubmit = () => {
67 return trackupload(row);