Works with any backend npm install Zero dependencies

First-class Vue 3 component via multipleupload/vue

A Composition-API-based Vue wrapper that exposes the core as a single-file component. Mounts on onMounted, tears down on onBeforeUnmount, and emits every core event as a kebab-case Vue event. Works with both <script setup> and Options API. Optional peer dependency - non-Vue consumers don't pull anything.

Subpath import: multipleupload/vue ships in the same npm package as the core - no separate install.
Install
npm install multipleupload vue
<script setup> usage
<script setup>
import { MultipleUpload } from 'multipleupload/vue';
import 'multipleupload/multipleupload.css';

const options = {
 uploadUrl: '/api/upload',
 multiple: true,
 autoUpload: false,
 strategy: 'chunked',
 chunkSize: 5 * 1024 * 1024,
 chunkConcurrency: 4
};

function onComplete(task, result) {
 console.log('uploaded', result.fileGuid, result.fileName);
}
function onProgress(task) {
 console.log(task.fileName, task.progress + '%');
}
</script>

<template>
 <MultipleUpload
 :options="options"
 @task-complete="onComplete"
 @task-progress="onProgress"
 @error="(err) => console.error(err)"
 />
</template>
Imperative access via template ref
<script setup>
import { ref } from 'vue';
import { MultipleUpload } from 'multipleupload/vue';

const upRef = ref(null);

function startUpload() { upRef.value?.upload(); }
function pauseAll() { upRef.value?.pauseAll(); }
function getInstance() { return upRef.value?.instance; } // full core API
</script>

<template>
 <MultipleUpload ref="upRef" :options="{ uploadUrl: '/api/upload', autoUpload: false }" />
 <button @click="startUpload">Start upload</button>
 <button @click="pauseAll">Pause all</button>
</template>
Emitted events

All core events are emitted as kebab-case Vue events:

task-added, task-removed, task-started, task-progress, task-complete,
task-failed, task-cancelled, task-paused, task-resumed,
queue-complete, all-complete, progress, state-restored, error
Reactive progress recipe
<script setup>
import { ref } from 'vue';
import { MultipleUpload } from 'multipleupload/vue';

const overall = ref(0);
</script>

<template>
 <MultipleUpload
 :options="{ uploadUrl: '/api/upload', multiple: true }"
 @progress="(o) => overall = o.progress"
 />
 <div class="progress">
 <div :style="{ width: overall + '%' }">{{ overall }}%</div>
 </div>
</template>
Nuxt 3 / SSR friendly

The wrapper only touches DOM inside onMounted, so it's safe under Nuxt 3 server rendering. Wrap in <ClientOnly> if your project disables hydration for upload widgets:

<ClientOnly>
 <MultipleUpload :options="options" @task-complete="onComplete" />
</ClientOnly>