Vue3 示例
vue
<template>
<div>
<input type="file" @change="handleFileChange" />
<button @click="handlePause">暂停上传</button>
<button @click="handleResume">继续上传</button>
<div>上传进度:{{ progress.toFixed(2) }}%</div>
<div>上传速度:{{ speed }}</div>
</div>
</template>
<script lang="ts" setup>
import { ref, computed } from "vue";
import { createUploader } from "enlarge-file-upload";
import type { Config, UploadOptions } from "enlarge-file-upload"; // TS导入类型
import axios from "axios";
const progress = ref<number>(0);
const speed = ref<string>("0 MB/s");
// 定义上传函数
async function uploadFunction({
chunk,
index,
hash,
cancelToken,
}: UploadOptions): Promise<void> {
const formData = new FormData();
formData.append("chunk", chunk);
formData.append("hash", hash);
formData.append("index", index.toString());
await axios.post("http://xxxx/api/upload", formData, {
cancelToken,
});
}
// 使用 computed 来生成 uploader 配置,类型为 Config
const uploaderConfig = computed<Config>(() => ({
chunkSize: 0.01 * 1024 * 1024, // 5MB
concurrency: 5,
maxRetries: 3,
uploadFunction,
onProgress: (progressValue: number) => {
progress.value = progressValue;
},
onSuccess: () => {
console.log("上传完毕");
},
onSpeed: (speedValue: string) => {
speed.value = speedValue;
},
}));
const uploader = ref<ReturnType<typeof createUploader> | null>(null);
uploader.value = createUploader(uploaderConfig.value);
const handleFileChange = (event: Event) => {
const target = event.target as HTMLInputElement;
const file = target.files?.[0];
if (file) {
uploader.value?.upload(file);
}
};
const handlePause = () => {
uploader.value?.pause();
};
const handleResume = () => {
uploader.value?.resume();
};
</script>
<style scoped></style>