问题

由于项目使用element-ui,然后upload默认上传方式不支持我们现有接口。参照了一下官方API及相关博客,解决了我现有问题。

解决方式

  1. 自定义上传:upload组件提供了一个http-request属性,官方给的描述是:覆盖默认的上传行为,可以自定义上传的实现
  2. 值的回填:upload组件提供了一个file-list属性,描述:上传的文件列表
    #具体代码实现

自定义上传行为

这里使用图片上传作为实例

template部分
<el-upload
  action="https://up-z2.qbox.me"
  list-type="picture-card"
  :http-request="uploadImg"
  :on-success="uploadImgSuccess"
  :on-remove="handleRemove">
  <i class="el-icon-plus"></i>
</el-upload>

以上是template部分,我们实现了http-request, on-success, on-remove三个属性

script部分
methods: {
	uploadImg (f) {
	  this.axios.get('./getToken').then((response) => {//获取token
	     let param = new FormData(); //创建form对象
	     param.append('file',f.file);//通过append向form对象添加数据
	     param.append('token',response.data.token);//通过append向form对象添加数据
	     param.append('key',response.data.key);//添加form表单中其他数据
	     let config = {
	       headers:{'Content-Type':'multipart/form-data'}
	     };  //添加请求头
	     this.axios.post(f.action,param,config)//上传图片
	     .then(response=>{
	       f.onSuccess(response.data)
	     })
	     .catch(({err}) => {
	       f.onError()
	     })   
	   })
	   .catch(() => {
	     f.onError()
	   })
	 },
	 uploadImgSuccess(response, file, fileList) {
		 // 缓存接口调用所需的文件路径
		 console.log('文件上传成功')
	 },
	 handleRemove(file, fileList) {
		 // 更新缓存文件
		 console.log('文件删除')
	 }
}

值回填

同样以图片上传为例

template部分
<el-upload
   action="https://up-z2.qbox.me"
   list-type="picture-card"
   :http-request="uploadImg"
   :on-remove="handleRemove"
   :on-change="handleImgChange"
   :file-list="imgList">
   <i class="el-icon-plus"></i>
 </el-upload>
script部分
data() {
	return {
		imgList: [{url: '初始需回填的图片url', status: 'finished'}]
	}
},
methods: {
	uploadImg (f) {
      this.axios.get('./getToken').then((response) => {//获取token
         let param = new FormData(); //创建form对象
         param.append('file',f.file);//通过append向form对象添加数据
         param.append('token',response.data.token);//通过append向form对象添加数据
         param.append('key',response.data.key);//添加form表单中其他数据
         let config = {
           headers:{'Content-Type':'multipart/form-data'}
         };  //添加请求头
         this.axios.post(f.action,param,config)//上传图片
         .then(response=>{
           f.onSuccess(response.data)
         })
         .catch(({err}) => {
           f.onError()
         })   
       })
       .catch(() => {
         f.onError()
       })
     },
     handleImgChange (file, fileList) {// 这里可以打印file查看数据结构
	      if (file.response) {//判断是否上传成功
	        this.imgList.push({url: this.tools.cdn(file.response.key), status: 'finished'})//上传成功之后把值添加到imglist中
	      }
	},
    handleRemove (file, fileList) {// 这里可以打印filelist查看数据结构
      this.imgList = fileList//删除某张图片时重新对imglist赋值
    }
}

写在最后

一直想把这个记下来,比较懒惰一看好久没有写博客了。由于是在我们工程里改的,暂时还没有写demo。如有问题,请大家指教

更新

看到一些小伙伴反应的问题,验证之后也发现了一些问题,感谢各位的反馈

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 7 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐