- 先说一下为什么想要使用这个http-request方法:
- 项目是用elementUI库,需求在没有提出以前用的是el-upload实现的上传功能
- 之前的上传限制啥的在以前的功能上已经写好了也不好在进行修改
- 查看文档发现:

个人理解就是我把参数配置传给你,你想咋实现自己来 - 首先是页面组件配置:
...
<el-upload
class="upload"
ref="upload"
:http-request="customUpload"
:headers="upload.headers"
:action="upload.url"
:disabled="upload.isUploading"
multiple
:show-file-list="false"
:file-list="fileList"
:data="upload.data"
:before-upload="handleBeforeUpload"
:on-success="handleUploadSuccess"
:on-progress="handleProgress"
>
...
...
customUpload(option){
var formData = new FormData();
formData.append("file", option.file);
formData.append("menuId", option.data.menuId);
let xml = new XMLHttpRequest();
xml.open('POST', option.action, true)
xml.setRequestHeader('Authorization', option.headers.Authorization);
option.xml = xml
option.status = 'notStart'
option.fileName = option.file.name
option.progress = 0
option.formData = formData
option.uuid = nanoid()
this.$store.dispatch('materialupload/setUploadList',option)
},
...
- 因为要切换页面也要保留上传列表 所以把相关的上传功能放到vuex中进行
const state = {
uploadList: [],
statusList:[],
limit: 3
}
let flag = true
const mutations = {
SET_UPLOADLIST: (state, options) => {
flag = true
state.uploadList.push(options)
},
SET_STATUSLIST: (state, uuid) => {
if(state.statusList.length>=state.limit){
state.statusList.shift()
}
state.statusList.push(uuid)
},
}
const actions = {
setUploadList: ({ commit, state }, options) => {
commit('SET_UPLOADLIST', options)
if(state.statusList.length<state.limit){
commit('SET_STATUSLIST', options.uuid)
uploadData(options)
}
},
refreshUploadData: ({ commit,state }, uuid) => {
let errorIndex = state.uploadList.findIndex(v=>v.uuid==uuid)
const obj = state.uploadList.splice(errorIndex,1)[0]
obj.xml.open('POST', obj.action, true)
obj.xml.setRequestHeader('Authorization', obj.headers.Authorization);
obj.status = 'notStart'
state.uploadList.push(obj)
if(state.statusList.length<state.limit){
commit('SET_STATUSLIST', obj.uuid)
uploadData(obj)
}
},
deleteUploadDate:({state}, uuid) => {
let statusIndex = state.statusList.indexOf(uuid)
let deleteIndex = state.uploadList.findIndex(v=>v.uuid==uuid)
if(statusIndex>-1){
state.uploadList[deleteIndex].xml.abort()
state.uploadList.splice(deleteIndex,1)
let lastuuid = state.uploadList[state.uploadList.length-1].uuid
if(lastuuid==uuid) flag = false
if(state.statusList.length>0&&flag){
let speed = state.uploadList.findIndex(v=>v.uuid==state.statusList[state.statusList.length-1])
if(speed<(state.uploadList.length-1)){
state.statusList.push(state.uploadList[speed+1].uuid)
uploadData(state.uploadList[speed+1])
}
}
state.statusList.splice(statusIndex,1)
}else{
state.uploadList.splice(deleteIndex,1)
}
},
deleteAllUploadData: ({state}) => {
state.statusList.forEach(v=>{
let deleteIndex = state.uploadList.findIndex(m=>m.uuid==v)
state.uploadList[deleteIndex].xml.abort()
})
state.statusList = []
state.uploadList = []
}
}
function uploadData(option) {
option.xml.upload.onprogress = (e) => {
option.progress = (e.loaded / e.total * 100).toFixed(0)
option.status = 'loading'
}
option.xml.onload = (e) => {
const response = JSON.parse(e.currentTarget.response)
if(response.code==200){
option.status = 'success'
}else{
option.status = 'error'
}
let lastuuid = state.uploadList[state.uploadList.length-1].uuid
if(lastuuid==option.uuid) flag = false
if(state.statusList.length>0&&flag){
let speed = state.uploadList.findIndex(v=>v.uuid==state.statusList[state.statusList.length-1])
if(speed<(state.uploadList.length-1)){
state.statusList.push(state.uploadList[speed+1].uuid)
uploadData(state.uploadList[speed+1])
}
}
state.statusList.splice(state.statusList.indexOf(option.uuid),1)
}
option.xml.onerror = (e) => {
option.status = 'error'
let lastuuid = state.uploadList[state.uploadList.length-1].uuid
if(lastuuid==option.uuid) flag = false
if(state.statusList.length>0&&flag){
let speed = state.uploadList.findIndex(v=>v.uuid==state.statusList[state.statusList.length-1])
if(speed<(state.uploadList.length-1)){
state.statusList.push(state.uploadList[speed+1].uuid)
uploadData(state.uploadList[speed+1])
}
}
state.statusList.splice(state.statusList.indexOf(option.uuid),1)
}
option.xml.send(option.formData);
}
export default {
namespaced: true,
state,
mutations,
actions
}
- 总结一下 :主要功能就是 文件上传包括(还有就是按顺序上传列表以及上传失败后重新上传等功能),文件删除 包括(上传完成删除,上传中删除 未上传删除 和 上传失败删除以及上传列表的清空)