Vue ElementUI中Upload组件如何实现文件批量上传

ElementUI中Upload组件如何批量上传

前言

最近一直使用Element提供的文件上传组件,但是使用后发现,其实当我们批量选中的时候,文件不是一次性都上传进去的,而是把它又拆分成一个个的文件进行上传。首先这容易造成的问题就是我们如果同时提交多个图片文件的时候,会重复的请求接口,造成接口并发访问的时可能出现的问题,下面是Element 的Github写的一个Issue

地址:Element在这里插入图片描述
上面也是提出了这个问题,就是希望能够合并请求提交,但是得到的官方回复却是:这个合并提交不在计划内,并不打算支持。

在这里插入图片描述

解决方案

后面通过查看issue发现,有一篇能够解决图片合并上传的需求:issue

主要是定义了两个方法,首先就是我们写的upload组件

      <el-upload
        class="upload-demo"
        ref="uploadFile"
        name="filedatas"
        :headers="importHeaders"
        :action="uploadAdminHost"
        :auto-upload="false"
        multiple
      >
        <el-button slot="trigger" size="small" type="primary">选取博客文件</el-button>
        <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">提交到服务器</el-button>
      </el-upload>

然后我们是上传逻辑,我们首先获取到upload组件上的dom,然后获取文件,上传地址和数据

    // 文件上传
    submitUpload() {
      let {uploadFiles, action, data} = this.$refs.uploadFile      
      this.uploadFiles({
        uploadFiles,
        data,
        action,
        success: (response) => {
          console.log(response)
          // 上传成功后,将里面的内容删除
          this.$refs.uploadFile.clearFiles();
          this.$refs.uploadPicture.clearFiles();
        },
        error: (error) => {
          console.log('失败了', error)
        }
      })
    },

下面封装了一个 uploadFiles 方法,这里uploadFiles 就可以是多文件,通过封装ajax方式

    /**
     * 自定义上传文件
     * @param fileList 文件列表
     * @param data 上传时附带的额外参数
     * @param url 上传的URL地址
     * @param success 成功回调
     * @param error 失败回调
     */
    uploadFiles({uploadFiles, headers, data, action, success, error}) {
      let form = new FormData()
      // 文件对象
      uploadFiles.map(file => form.append("filedatas", file.raw))
      // 附件参数
      for (let key in data) {
        form.append(key, data[key])
      }
      let xhr = new XMLHttpRequest()
      // 异步请求
      xhr.open("post", action, true)
      // 设置请求头
      xhr.setRequestHeader("Authorization", getToken());
      xhr.onreadystatechange = function() {
        if (xhr.readyState == 4){
          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
            success && success(xhr.responseText)
          } else {
            error && error(xhr.status)
          }
        }
      }
      xhr.send(form)
    }

最后后台接口,同时接受多个文件

    @PostMapping("/pictures")
    public Object uploadPics(HttpServletRequest request, List<MultipartFile> filedatas) {
          // 逻辑代码
	}

最后我们查看请求,会同时携带多个文件

在这里插入图片描述

并且返回多个上传成功的结果

在这里插入图片描述

尾言

本文同时发表至我的个人博客:蘑菇博客

个人博客开源在gitee中,欢迎大家start支持~ gitee地址

VueElementUI实现文件上传需要使用ElementUI的el-upload组件。首先需要安装ElementUI和相关插件: 1.通过 npm 安装 ElementUIvue-resource: npm install element-ui --save npm install vue-resource --save 2.在Vue项目的main.js文件引入ElementUIVueResource: import Vue from 'vue' import ElementUI from 'element-ui' import VueResource from 'vue-resource' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) Vue.use(VueResource) 3.在需要上传文件的组件添加el-upload组件: <template> <el-upload class="upload-demo" :headers="headers" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeUpload" :on-success="handleSuccess"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">jpg/png 文件,最大支持 2MB</div> </el-upload> </template> 其,headers是文件上传时需要携带的请求头;handlePreview、handleRemove、beforeUpload和handleSuccess是自定义的方法。 4.在组件的script添加自定义方法: export default { data () { return { headers: { Authorization: 'Bearer ' + sessionStorage.getItem('token') } } }, methods: { handlePreview (file) { console.log(file) }, handleRemove (file) { console.log(file) }, beforeUpload (file) { if (file.type !== 'image/png' && file.type !== 'image/jpeg') { this.$message.error('上传文件只能是jpg或png格式!') return false } if (file.size / 1024 / 1024 > 2) { this.$message.error('上传文件大小不能超过 2MB!') return false } }, handleSuccess (response, file, fileList) { console.log(response, file, fileList) } } } 在以上方法,handlePreview、handleRemove和handleSuccess方法分别是文件预览、文件移除和文件上传成功时触发的方法;beforeUpload方法用于限制文件大小和格式。 5.最后,可以通过el-upload组件的action属性指定文件上传的处理地址: <el-upload class="upload-demo" :headers="headers" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeUpload" :on-success="handleSuccess" action="http://your-upload-url.com"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">jpg/png 文件,最大支持 2MB</div> </el-upload>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值