el-upload文件上传组件的封装

news2024/9/21 16:39:29

样式1

 

 样式2

 上传的格式

 

// annexUrl 数据格式如下

[
    {
        "uid": 1682329534561,
        "name": "2023/04/24/273f36b860a74e79be3faed3ce20236f.pdf",
        "suffix": ".pdf",
        "url": "http://192.168.0.254:19000/annex/2023/04/24/273f36b860a74e79be3faed3ce20236f.pdf",
        "status": "success"
    },
    {
        "uid": 1682386966277,
        "name": "2023/04/25/eee1b9f5271543989d792d0fd1bb690c.doc",
        "suffix": ".doc",
        "url": "http://192.168.0.254:19000/annex/2023/04/25/eee1b9f5271543989d792d0fd1bb690c.doc",
        "status": "success"
    },
    {
        "name": "2023/04/25/9f910e55bad44e91a9f96b6d4a1aaeb6.pdf",
        "suffix": ".pdf",
        "url": "http://192.168.0.254:19000/annex/2023/04/25/9f910e55bad44e91a9f96b6d4a1aaeb6.pdf"
    },
    {
        "name": "2023/04/25/02b17209170f4765908d49ed8aa82908.docx",
        "suffix": ".docx",
        "url": "http://192.168.0.254:19000/annex/2023/04/25/02b17209170f4765908d49ed8aa82908.docx"
    }
]

 upload接口返回的数据格式如下

 

 

组件封装

<!--
 * @Description: 文件上传通用 组件 页面
 * @Author: mhf
 * @Date: 2023-04-24 18:32:39
 * @Desc: 具体使用请参考 attachConfigDialog.vue 页面
-->
<template>
  <div class="">
    <el-upload
      class="upload-demo"
      :disabled="utilsObj.isDisabled"
      :action="actionUrl"
      :headers="headerObj"
      :file-list="utilsObj.fileList"
      :limit="utilsObj.limitNum"
      :multiple="utilsObj.isMultiple"
      :on-preview="handlePreview"
      :on-success="handleSuccess"
      :on-remove="handleRemove"
      :before-upload="handBeforeUpload"
      :on-exceed="handleExceed"
    >
      <!-- 上传按钮样式选择 -->
      <div v-if="utilsObj.typeStyle === 0">
        <!-- 按钮样式 -->
        <el-button
          :disabled="utilsObj.isDisabled"
          size="small"
          icon="iconfont if-biaodancaozuo-xinzeng"
          class=""
        >附件
        </el-button>
      </div>

      <!-- el-icon样式 -->
      <div v-if="utilsObj.typeStyle === 1">
        <div v-if="!utilsObj.isDisabled" class="fileBox">
          <i class="iconfont if-daoru"/>
          <div>点击上传</div>
        </div>
      </div>
      <!-- 提示:若想使用自定义样式,可添加插槽:<slot></slot> -->
      <!-- 上传按钮样式选择 -->
    </el-upload>
  </div>
</template>

<script>
  import { getToken } from '@/utils/auth'

  export default {
    name: 'index',
    components: {},
    props: {
      /* 注意: 如果props里面的对象有默认参数时,必须用函数return一个对象 */
      utilsObj: {
        type: Object,
        default: () => ({
          isDisabled: false, // 是否禁用
          fileList: [], // 附件列表
          limitNum: 3, // 限制上传的文件数量 (个)
          fileSize: 50, // 单文件上传大小(MB)
          typeStyle: 0, // 文件上传的样式控制
          isMultiple: false // 是否支持同时选择多个文件
        })
      }, // 附件上传的配置项
      actionUrl: {
        type: String,
        default: process.env.VUE_APP_BASE_API + '/tlxx-modules-annex/minioAnnex/upload'
      }, // 文件上传接口,
      headerObj: {
        type: Object,
        default: function() {
          return {
            AuthorizationSys: getToken()
          }
        }
      }, // 文件上传请求头参数 --- token
    },
    data() {
      return {
        resFileArr: [], // 最终需要的文件数据
      }
    },
    methods: {
      /**
       * @Event 方法
       * @description: 点击文件列表中已上传的文件时的钩子
       * */
      handlePreview(file) {
        if (file.response) {
          // 上传文件的时候 查看
          window.open(file.response.data.url)
        } else {
          // 文件上传成功之后返回值 查看
          window.open(file.url)
        }
      },

      /**
       * @Event 方法
       * @description: 文件上传成功时的钩子
       * */
      handleSuccess(file) {
        if (file.code === 1) {
          this.resFileArr.push(file.data)
          console.log(this.resFileArr, 'resFileArr')
          this.$emit("getFileUploadYt", this.resFileArr);
        } else {
          this.$message.warning(file.message)
        }
      },

      /**
       * @Event 方法
       * @description: 文件列表移除文件时的钩子
       * */
      handleRemove(file) {
        console.log(file.response, this.resFileArr, file)
        if (file.response) {
          console.log('response have')
          this.resFileArr.map((item, index) => {
            if (item === file.response.data || item.url === file.response.data.url) {
              this.resFileArr.splice(index, 1)
              console.log(index)
              this.$emit("getFileUploadYt", this.resFileArr);
            }
          })
        } else {
          console.log('no response')
          this.resFileArr.map((item, index) => {
            if (item === file || item.url === file.url) {
              this.resFileArr.splice(index, 1)
              console.log(index)
              this.$emit("getFileUploadYt", this.resFileArr);
            }
          })
        }
      },

      /**
       * @Event 方法
       * @description: 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
       * */
      handBeforeUpload(file) {
        if (
          [
            'application/vnd.android.package-archive',
            'application/x-zip-compressed',
            'application/pdf',
            'application/msword',
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'application/vnd.ms-excel',
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
          ].indexOf(file.type) === -1
        ) {
          this.$message.error(
            '请上传后缀名为 apk、zip、pdf、doc、docx、xls、xlsx的文件'
          )
          return false
        }
        if (file.size > this.utilsObj.fileSize * 1024 * 1024) {
          this.$message.error(`文件大小不能超过 ${this.utilsObj.fileSize}MB`)
          return false
        }
      },

      /**
       * @Event 方法
       * @description: 文件超出个数限制时的钩子
       * */
      handleExceed(files, fileList) {
        this.$message.warning(`当前限制选择 ${this.utilsObj.limitNum} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
      }

    },
    created() {
    },
    mounted() {
      setTimeout(() =>{
        if (this.utilsObj.fileList) {
          this.resFileArr = this.utilsObj.fileList
        }
      }, 500)

    }
  }
</script>

<style lang="scss" scoped>
  .fileBox {
    height: 36px;
    background: rgba(255, 255, 255, 0);
    border-radius: 4px;
    display: flex;
    align-items: center;
    color: #1492ff;
    font-weight: bold;
    font-size: 16px;
    i {
      margin-right: 5px;
    }
  }
  .disabledClass {
    margin-top: -35px;
  }
</style>

页面中使用(红框部分)

效果:

 

    <el-form-item label="附件 :" prop="annexUrl">
        <fileUploadYt ref="fileUploadYt" @getFileUploadYt="getAnnexUrl" :utilsObj="fileUploadUtils"/>
      </el-form-item>
data() {
    return {
               fileUploadUtils: {
                    isDisabled: false, // 是否禁用
                    fileList: [], // 回显的附件列表
                    limitNum: 4, // 限制上传的文件数量 (个)
                    typeStyle: 0, // 文件上传的样式控制
                  }, // 附件上传的配置项
        
    }
}




 /**
    * @Event 方法
    * @description: 弹窗关闭事件
    * */
hideDialog() {
      this.fileUploadUtils.fileList = []; // 关闭弹窗时,清空附件列表
},



 /**
    * @Interface 接口
    * @description: 获取详情
    * */
   getDetail(id) {
      getProjectAnnexInfo(id).then((res) => {
        if (res.code === 1) {
          this.formData = res.data;
          this.formData.annexUrl = JSON.parse(res.data.annexUrl);
          if (!this.formData.annexUrl) {
            this.formData.annexUrl = [];
          }
          this.fileUploadUtils.fileList = this.formData.annexUrl; // 附件回显
          console.log(this.fileUploadUtils.fileList, 0)
        } else {
          this.$message.error("获取详情数据失败!");
        }
      });
    },








 /**
    * @Event 方法
    * @description: 获取组件上传得到的最终文件数组
    * */
    getAnnexUrl(data) {
      console.log(data)
      this.formData.annexUrl = data
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM系列(十) 垃圾收集器之 Parallel Scavenge/Old

上篇文章我们讲解了单线程垃圾收集器 Serial/SerialOld &#xff0c;与之相对应的多线程垃圾收集器就是 Parallel Scavenge/Old&#xff0c; 本文我们讲解下多线程垃圾收集器 Parallel Scavenge/Old 垃圾收集器 新生代收集器&#xff1a; Serial、ParNew、Parallel Scavenge&…

数据库 | 什么是视图?怎么使用?什么是索引?

目录 一、视图 1 、视图概念 2、为什么要使用视图 3 、性能问题 4 、定义视图 5、查看视图 6、删除视图 二、索引 1、引入索引的问题 2、索引是什么 3、索引为什么选择b树 一、视图 1 、视图概念 视图&#xff08;View&#xff09;是一种虚拟存在的表&#xff0c;对…

【DRF配置管理】如何建立完善的DRF自带接口docs文档

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django使用DRF框架 【DRF配置管理】如何实现JWT认证 【DRF配置管理】如何在视图函数配置参数(一) 【DRF配置管理】如何…

okcc呼叫问题的解决方法(建议收藏)

很多客户开始使用OKCC呼叫中心系统&#xff0c;运营经常遇到的问题是呼叫打不通&#xff0c;无话单&#xff0c;呼叫秒挂&#xff0c;语音提示"您没有使用业务的权限"等等异常情况&#xff0c;而且反馈线路正常&#xff0c;使用呼叫系统拨打就是呼不通。 OKCC系统…

史上最烂 spring aop 原理分析

盗引中篇spring aop spring aop: jdk 动态代理和 cglib 动态代理的特点、区别、使用方式、原理及各自对反射的优化、二者在 spring 中的统一、通知顺序、从 Aspect 到 Advisior、静态通知调用、动态通知调用。 版本 jdk&#xff1a;8spring&#xff1a;5.3.20spring boot&…

华为OD机试(20222023)真题目录 + 考点 + 复盘思路

大家好&#xff0c;我是哪吒。 本专栏包含了最新最全的华为OD机试真题&#xff0c;有详细的分析和Java代码解答。已帮助1000同学顺利通过OD机考&#xff0c;发现新题目&#xff0c;随时更新。 以下为华为OD机试真题题库。 1、华为OD机试真题&#xff08;Java&#xff09;&am…

创建型模式-原型模式

原型模式 介绍 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象 结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的的 clone() 方法。具体原型类&#xff1a;实现抽象原型类的 cl…

Linux文本处理三大利器Grep、AWK、Sed

写在前面 Linux三剑客是文本处理工具&#xff0c;它们可以帮助我们快速、高效地对文本进行处理。其中包括了grep、awk、以及sed这三个强大的命令行工具。 Linux 三剑客主要作用: grep&#xff0c;它可以根据正则表达式查找相关内容并打印对应的数据。awk&#xff0c;它可以根…

redhat8配置vsftpd服务

目录 一、匿名访问模式 1.1、ftp服务器端修改配置&#xff08;配置文件&#xff1a;/etc/vsftpd/vsftpd.conf&#xff09; 1.2 修改ftp目录的权限 1.3 设置selinux服务对ftp服务的访问规则策略为允许 1.4 防火墙添加ftp服务 1.5 测试 二、本地用户模式 2.1 服务端修改配…

6、什么是类型断言?

虽然 TypeScript 很强大&#xff0c;但有时还不如我们了解一个值的类型方便&#xff0c;这时候我们更希望 TypeScript 不要帮我们进行类型检查&#xff0c;而是交给我们自己来&#xff0c;所以就用到了类型断言。类型断言有点像是一种类型转换&#xff0c;它把某个值强行指定为…

Vue收集表单数据学习笔记

收集表单数据 v-model双向数据绑定&#xff0c;收集的是input框的value&#xff0c;单选按钮不存在value&#xff0c;就像代码中的男女选项&#xff0c;即使绑定性别v-model“sex”&#xff0c;控制台依然不能接收性别的值&#xff0c;因为没有value值&#xff0c;&#xff0c…

python 第二章——数据类型详解

文章目录 前言一、什么是数据类型1.变量2.注释 二、数字三、字符串四、布尔五、列表六、元组七、集合八、字典总结 前言 本系列教程目录&#xff0c;可点击这里查看&#xff1a;Python教程目录 学习一门编程语言&#xff0c;第一件事就应该是熟练掌握这门编程语言的基本数据类…

[Java]JavaWeb开发中的MVC设计模式

一、有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet&#xff0c;如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性&#xff0c;对于一个小型的网站这样的编写没有任何问题&#xff0c;但是一但…

MCDF代码详解,mcdf_rgm_pkg.sv代码超详细注释

寄存器模块代码详解 好戏开始: `include "param_def.v" package mcdf_rgm_pkg; import uvm_pkg::*; `include "uvm_macros.svh" import reg_pkg::*; //具有uvm_reg类型的专用寄存器描述[write-red-reg] class ctrl_reg extends uvm_r…

机器人教学中游戏化课程案例尝试

本文内容严格按创作模板发布&#xff1a; 2023年LPL春季赛季后赛正在火热进行中&#xff0c;你们心中的总冠军是哪支队伍呢&#xff1f;作为热爱游戏的程序猿&#xff0c;一起来聊聊你那些有意义的游戏开发经历吧&#xff01; 游戏化ROS机器人课程的优势有以下七点&#xff1a…

第3章-运行时数据区

此章把运行时数据区里比较少的地方讲一下。虚拟机栈&#xff0c;堆&#xff0c;方法区这些地方后续再讲。 转载https://gitee.com/youthlql/JavaYouth/tree/main/docs/JVM。 运行时数据区概述及线程 前言 本节主要讲的是运行时数据区&#xff0c;也就是下图这部分&#xff0c…

5.微服务项目实战---Gateway--服务网关,实现统一认证、鉴权、监控、路由转发等

5.1 网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。 这样的架构&#xff0…

用友联合7家信创生态伙伴成立“信创领先实践联盟”,助力企业数智化国产替代

数字经济背景下&#xff0c;面对国际局势不稳定等以切不确定因素&#xff0c;只有突破和掌握关键核心技术&#xff0c;打造生态话语权&#xff0c;掌握产业发展主动权&#xff0c;向产业价值链高端迈进&#xff0c;我国才能摆脱受制于人局面。而推动信创产业繁荣发展&#xff0…

SAP-选择实施离散制造模式还是重复制造模式?

Implement Discrete Manufacturing or Repetitive Manufacturing? 翻译一篇&#xff0c;反正我也写不出来~~~~ “狗还是猫&#xff1f;” 这可能是世界上第二难的问题。 想知道最难的是什么&#xff1f; 这里是&#xff1a; “实施离散制造还是重复制造&#xff1f;” 作…

【设计模式】我终于读懂了访问者模式。。。

&#x1f330;测评系统的需求 将观众分为男人和女人&#xff0c;对歌手进行测评&#xff0c;当看完某个歌手表演后&#xff0c;得到他们对该歌手不同的评价(评价 有不同的种类&#xff0c;比如 成功、失败 等)传统方案 &#x1f331;传统方式的问题分析 如果系统比较小&…