Works with any backend npm install Zero dependencies
All Callbacks Console

Every single callback wired up and logged. The ultimate event reference.

(function() {
    var logEl = document.getElementById('log');
    function log(m) { var d = document.createElement('div'); d.className='pkg-log-entry'; d.textContent=new Date().toLocaleTimeString()+' '+m; logEl.appendChild(d); logEl.scrollTop=logEl.scrollHeight; }
    document.getElementById('clear-log').addEventListener('click', function() { logEl.innerHTML=''; });
    new MultipleUpload('#demo', {
        uploadUrl: '/api/upload',
        multiple: true,
        removable: true,
        paste: true,
        onInit: function() { log('onInit'); },
        onSelect: function(f) { log('onSelect: ' + f.length + ' files'); },
        onFileAdded: function(t) { log('onFileAdded: ' + t.fileName); },
        onBeforeUpload: function(t) { log('onBeforeUpload: ' + t.fileName); },
        onTaskStart: function(t) { log('onTaskStart: ' + t.fileName); },
        onTaskProgress: function(t) { log('onTaskProgress: ' + t.fileName + ' ' + t.progress + '%'); },
        onTaskComplete: function(t) { log('onTaskComplete: ' + t.fileName); },
        onTaskError: function(t,e) { log('onTaskError: ' + t.fileName + ' ' + e); },
        onTaskRetry: function(t) { log('onTaskRetry: ' + t.fileName); },
        onTaskPause: function(t) { log('onTaskPause: ' + t.fileName); },
        onTaskResume: function(t) { log('onTaskResume: ' + t.fileName); },
        onAfterUpload: function(t) { log('onAfterUpload: ' + t.fileName); },
        onCancel: function(f,t) { log('onCancel: ' + (f?f.name:t.fileName)); },
        onProgress: function(p) { log('onProgress: ' + p.percent + '%'); },
        onChange: function(f) { log('onChange: ' + f.length + ' completed'); },
        onQueueComplete: function(f) { log('onQueueComplete: ' + f.length + ' files'); },
        onError: function(m,n) { log('onError: ' + (n||'') + ' ' + m); },
        onValidationError: function(m,n) { log('onValidationError: ' + (n||'') + ' ' + m); },
        onPaste: function(f) { log('onPaste: ' + f.length + ' files'); },
        onDrop: function() { log('onDrop'); },
        onDragEnter: function() { log('onDragEnter'); },
        onDragLeave: function() { log('onDragLeave'); },
        onEnable: function() { log('onEnable'); },
        onDisable: function() { log('onDisable'); },
        onDestroy: function() { log('onDestroy'); }
    });
})();

Event Log