vue实现上传进度
Vue实现上传进度的方法
使用axios的onUploadProgress方法
在Vue项目中,可以通过axios的onUploadProgress回调函数实时获取上传进度。以下是一个示例代码片段:
<template>
<div>
<input type="file" @change="handleFileUpload" />
<progress :value="uploadProgress" max="100"></progress>
<span>{{ uploadProgress }}%</span>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
uploadProgress: 0
};
},
methods: {
handleFileUpload(event) {
const file = event.target.files[0];
const formData = new FormData();
formData.append('file', file);
axios.post('/upload', formData, {
onUploadProgress: (progressEvent) => {
this.uploadProgress = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
}
}).then(response => {
console.log('上传成功', response);
}).catch(error => {
console.error('上传失败', error);
});
}
}
};
</script>
使用XMLHttpRequest实现
如果不使用axios,可以直接使用XMLHttpRequest的upload事件来监听上传进度:
methods: {
handleFileUpload(event) {
const file = event.target.files[0];
const xhr = new XMLHttpRequest();
const formData = new FormData();
formData.append('file', file);
xhr.upload.addEventListener('progress', (event) => {
if (event.lengthComputable) {
this.uploadProgress = Math.round((event.loaded / event.total) * 100);
}
});
xhr.open('POST', '/upload', true);
xhr.send(formData);
}
}
使用第三方库
如果需要更复杂的上传功能,可以考虑使用第三方库如vue-upload-component或uppy:
// 使用vue-upload-component示例
import VueUploadComponent from 'vue-upload-component';
export default {
components: {
'file-upload': VueUploadComponent
},
data() {
return {
uploadProgress: 0
};
},
methods: {
onProgress(file) {
this.uploadProgress = file.progress;
}
}
};
进度条样式优化
可以根据需求自定义进度条的样式,例如使用Vuetify的v-progress-linear组件:
<template>
<v-progress-linear
v-model="uploadProgress"
color="primary"
height="10"
></v-progress-linear>
</template>
注意事项
确保后端接口支持分块上传或能够正确返回上传进度信息。某些服务器可能需要额外配置才能支持进度跟踪功能。







