elementui组件el-upload实现批量文件上传

el-upload组件上传文件时,每传一个文件会调一次接口,所以当上传多个文件的时候,有 n 个文件就要调 n 次接口。

刚好之前工作中遇到使用el-upload组件批量上传文件的需求,来看看怎么实现。

思路:

1.取消组件的自动上传,使用自定义上传

2.组件开启多选文件

3.使用formData上传

html代码如下:

html 复制代码
<el-upload
      multiple
      action="#"
      :http-request="handleHttpRequest"
      :before-upload="handleBeforeUpload"
      :file-list="fileList"
      :limit="limit"
      :requestUrl="requestUrl"
      :show-file-list="true"
      class="upload-file-uploader"
      ref="fileUpload"
    >
      <!-- 上传按钮 -->
      <el-button size="mini" type="primary">选取文件</el-button>

      <!-- 上传提示 -->
      <div class="el-upload__tip" slot="tip" v-if="showTip">
        请上传
        <template v-if="fileSize">
          大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
        </template>
        <template v-if="fileType">
          格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
        </template>
        的文件
      </div>
    </el-upload>
    <el-button size="mini" type="primary" @click="submitUpload">上传</el-button>

data数据定义:

javascript 复制代码
data() {
    return {
      limit: 50;
      uploadList: [],
      baseUrl: process.env.VUE_APP_BASE_API,
      fileList: [],
      fileData: [],
    };
  },

methods定义方法:

javascript 复制代码
  methods: {
    // 覆盖默认的上传行为
    handleHttpRequest(obj) {
      this.fileData.push(obj.file);
    },
    submitUpload() {
      let formData = new FormData();
      for (let i = 0; i < this.fileData.length; i++) {
        formData.append("file", this.fileData[i]);
      }
      uploadFileResource(formData).then((res) => {
        if (res.code == "200") {
          this.$message.success("上传成功");
          this.uploadList = res.data.map((item)=>{
            return { name: item.fileName, url: item.url };
          })
          this.uploadList = [];
          this.$modal.closeLoading();
        } else {
          this.$message.error("上传失败");
        }
      });
    },
    // 上传前校检格式和大小
    handleBeforeUpload(file) {
      // 校检文件类型
      if (this.fileType) {
        const fileName = file.name.split(".");
        const fileExt = fileName[fileName.length - 1];
        const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
        if (!isTypeOk) {
          this.$modal.msgError(
            `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
          );
          return false;
        }
      }
      // 校检文件大小
      if (this.fileSize) {
        const isLt = file.size / 1024 / 1024 < this.fileSize;
        if (!isLt) {
          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
          return false;
        }
      }
      return true;
    },
}

接口定义:

javascript 复制代码
// 上传文件
export function uploadFileResource(data) {
  return request({
    url: '/common/uploadFileResource',
    method: 'post',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, // 这句很重要,以formData的方式上传
    data
  })
}

上传效果图:

相关推荐
jktantan2 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
2601_962885723 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel3 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓3 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人4 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every4 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad4 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新5 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易5 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
风骏时光牛马6 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端