element-ui附件上传及在线查看详细总结,后续赋源码

一、附件上传

       1、在element-ui上面复制相应代码

            

            a、accept="image/*,.pdf,.docx,.xlsx,.doc,.xls"  是规定上传文件的类型,若是不限制,可以直接将accept=‘all'即可;

             b、:action="action" 这个属性就是你的上传附件的地址;

一般情况下,上传一个文件,后端会给两个接口,第一个接口就是写在action里面的,这个接口的作用是返回一个id或则一个其他的唯一属性;接着第二个接口就是上传附件的接口,这个返回的唯一属性会被当做第二个接口的参数提交,此时就已经完成了附件的上传。

二、在线查看

        1、首先先安装依赖包

              用的是vue-office,地址:vue-office简介 | vue-office (501351981.github.io)

#docx文档预览组件
npm install @vue-office/docx vue-demi
#excel文档预览组件
npm install @vue-office/excel vue-demi
#pdf文档预览组件
npm install @vue-office/pdf vue-demi
//如果是vue2.6版本或以下还需要额外安装 @vue/composition-api
npm install @vue/composition-api

       2、在vue文件中引入vue-office

           

       3、开始判断文件的类型

            接着我们要想实时的看到自己的附件,那么肯定一点就是得区分我们得附件类型

            判断文件的类型我这里有两个方法推荐:

            第一种:就是运用计算属性和includes来设置一个变量,再根据变量使用v-if控制显示

                        

             第二种:js的endsWith()   该方法用于测试字符串是否以指定的后缀结束,将获取到的文件名放入该方法中,判断后缀类型,不过这里的判断返回的是布尔值,然后再配合v-if使用以控制显示。

        4、添加点击事件

              这里设计的在线预览是点击附件后直接在下方显示

              找到上传附件时的钩子,根据业务需求,判断是上传之前可以看还是上传之后可以看,有两种情况

              第一种:在上传附件之前就想查看

                            这种情况我先放一下,因为这里我先讲得是直接上传附件,在上传之前查看,一般用在手动上传的时候,我后续再更,但是放心,我都会更新记录下来的~~

              第二种:在上传附件成功之后再查看

                             给附件绑定一个点击事件:on-preview="handlePreview",绑定这个事件之后,可以获取到参数里面的file,即一个对象,将这个对象赋值给一个新的对象this.currentFile = file,而这个currentFile在判断类型时不可缺少的;之后,取currentFile里面raw赋值给vue-office标签里的src属性就可以了

              第三种:同时拥有,哈哈哈哈这种就把前两种都写上就行了

目前这一块我是以组件的形式在使用,毕竟用的比较多,这样更方便些,以上是我自己的总结,主要是给自己看的,因为我有健忘,一段时间不用就会忘记,大家要是有疑问可以随时私信我,我看到了就会回复,毕竟学习也是相互的,加油。

以下是源码----------------------------------

<template>
  <div>
    <!-- <el-dialog title="上传附件" :visible.sync="dialogFormVisible" width="50%" append-to-body="true"> -->
    <el-upload
      ref="upload"
      class="upload-demo"
      :action="action"
      :before-remove="beforeRemove"
      multiple
      :on-preview="handlePreview"
      :file-list="fileList"
      :on-success="handleSuccess"
      :before-upload="beforeUpload"
      accept="image/*,.pdf,.docx,.xlsx,.doc,.xls"
      :on-remove="handleRemove"
      :limit="6"
      :on-exceed="handleExceed">
      <el-button size="small" type="primary">选取附件</el-button>
    </el-upload>

    <!-- 查看 -->
    <div v-if="currentFile">
      <div v-if="currentFileType === 'excel'" class="officeShow">
        <vue-office-excel :src="fileSrc" style="height: 40vh;width: 100%;" />
      </div>
      <div v-else-if="currentFileType === 'pdf'" class="officeShow">
        <vue-office-pdf :src="fileSrc" style="height: auto;width: 100%;" />
      </div>
      <div v-else-if="currentFileType === 'word'" class="officeShow">
        <vue-office-docx :src="fileSrc" style="height: 40vh;width: 100%;overflow: scroll;" />
      </div>
      <div v-else class="officeShow">
        <img :src="fileSrc" style="height: auto;width: 100%;">
      </div>
    </div>



    <!-- <div slot="footer" class="dialog-footer">
        <el-button @click="cancellation">取 消</el-button>
        <el-button type="primary" @click="save">保 存</el-button>
        <el-button type="primary" @click="upClick">上传</el-button>
      </div> -->
    <!-- </el-dialog> -->
  </div>
</template>

<script>
// 引入VueOfficePdf组件
import VueOfficePdf from '@vue-office/pdf'
// docx
import VueOfficeDocx from '@vue-office/docx'
import '@vue-office/docx/lib/index.css'
// 引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
// 引入相关样式
import '@vue-office/excel/lib/index.css'

export default {
  components: {
    VueOfficeExcel,
    VueOfficePdf,
    VueOfficeDocx
  },
  props: {
    projectId: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      dialogFormVisible: false,
      action: process.env.VUE_APP_BASE_API + '/file/upload',
      fileList: [],
      currentFile: null,
      files: []
    }
  },
  computed: {
    currentFileType() {
      let type = ''
      if (this.currentFile.name) {
        const arr = this.currentFile.name && this.currentFile.name.split('.')
        type = arr[arr.length - 1]
      }
      switch (true) {
        case ['xls', 'xlsx'].includes(type):
          return 'excel'
        case ['doc', 'docx'].includes(type):
          return 'word'
        case ['pdf'].includes(type):
          return 'pdf'
        default:
          return 'img'
      }
    },
    fileSrc() {
      if (this.currentFileType === 'img') {
        const windowURL = window.URL || window.webkitURL
        const src = windowURL.createObjectURL(this.currentFile.raw)
        return src
      } else {
        return this.currentFile.raw
      }
    }
  },
  methods: {
    show() {
      this.dialogFormVisible = true
    },
    cancellation() {
      this.dialogFormVisible = false
      this.fileList = []
    },
    // 暂存
    // save() {
    //   this.dialogFormVisible = false
    //   this.$notify({
    //     title: '成功',
    //     message: '已保存',
    //     type: 'success',
    //     duration: 1000
    //   })
    // },
    handleRemove(file, fileList) {
      this.fileList = fileList
      // 判断溢出的文件是否当前预览中的文件
      if (fileList.findIndex(item => item.uid === this.currentFile.uid) === -1) {
        this.currentFile = null
      }
    },
    handlePreview(file) {
      // console.log(file)
      this.currentFile = file
    },
    handleExceed(files, fileList) {
      this.$message.warning(`当前限制选择 6 个文件,本次选择了 ${files.length}个文件,共选择了 ${files.length + fileList.length}个文件`)
    },
    beforeRemove(file, fileList) {
      return this.$confirm(`确定移除 ${file.name} ?`)
    },
    handleSuccess(response, file, fileList) {
      console.log(response, file, fileList)
      this.files.push(response)
    },
    beforeUpload(file) {
      const isLt20M = file.size / 1024 / 1024 < 20
      if (!isLt20M) {
        this.$message.error('上传文件大小不能超过 20MB!')
      }
      return isLt20M
    }
  }
}
</script>

<style lang="scss" scoped></style>

.....后续马上更,我有其他事情需要去处理一下

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot集成Elasticsearch 7.16.3

环境&#xff1a;Elasticsearch 版本 7.16.3 Elasticsearch for windows下载地址 windows 若依 spring boot版本 2.6.0 pom文件添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch<…

细数Android开发者的艰辛历程,android零基础

首先我们来看一下组件化项目和传统项目的区别: 在传统的项目里 我们通常情况下会有一个commonLib的Libary模块和一个app的application模块&#xff0c;业务中的逻辑都写在app中各个功能模块放到不同的包下。这样做有以下几个主要的缺点&#xff1a; 1.无论分包做的再好&…

LLM@本地语言大模型@Gemma的安装与使用@dockerDesktop的安装和启动

文章目录 准备refsollama安装过程2b模型的效果小结&#x1f47a; ollama的进一步使用帮助文档查看ollama安装了哪些模型使用皮肤来使聊天更易用 使用Chatbot UI皮肤安装docker&#x1f47a;启动docker载入和退出dockerchatbot 网页版皮肤 使用命令行聊天小结&#x1f47a; 准备…

探索口袋中的远程控制神器

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

tomcat安装步骤流程

安装tomcat是基于安装java的基础上的 JAVA 举例说明&#xff1a; 关闭防火墙 下载java [rootlocalhost ~]#yum install java -y rootlocalhost ~]#yum install epel-release.noarch -y [rootlocalhost ~]#yum provides */javac [rootlocalhost data]#yum install java-1.8.0-o…

Intel SGX 概述 --潦草笔记

文章目录 前言一、SGX介绍1.1 指令介绍1.2 数据结构 二、内存保护过程2.1 enclave页面缓存&#xff08;EPC&#xff09;2.2 Enclave页面缓存映射&#xff08;EPCM&#xff09; 三、部署SGX参考资料 前言 SGX是Intel开发的新的处理器技术&#xff0c;可以在计算平台上提供一个可…

Leetcode583. 两个字符串的删除操作 -代码随想录

题目&#xff1a; 代码(首刷自解 2024年2月29日&#xff09;&#xff1a; class Solution { public:// 动态规划 好像和找最长公共子序列一样&#xff1f;int minDistance(string word1, string word2) {int sz1 word1.size();int sz2 word2.size();// dp initvector<vec…

form 表单 转换为json-多种(通用/多维数组) 全方案

JSON 在 JavaScript 中重要&#xff0c;因其轻量、通用、易读&#xff0c;适用于数据交换、存储和传输。 为什么写这个文章&#xff0c;废话不多&#xff0c;直接近主题。 一、通用 一般采用jquery编写 var key $(#"cyberwin_form_card_newadd").serialize(); 结…

自动化测试摸索:python+selenium+pytest(持续更新.....)

一、环境搭建 1、python 安装 下载链接&#xff1a;Python Releases for Windows | Python.org 自己选择合适的版本下载 当下载完毕时&#xff0c;找到该安装程序&#xff1a;python-3.12.2-amd64.exe文件&#xff0c;双击启动安装向导。 为了防止C:盘文件因系统故障或者无…

C# 高阶语法 —— Winfrom链接SQL数据库的存储过程

存储过程在应用程序端的使用的优点 1 如果sql语句直接写在客户端&#xff0c;以一个字符串的形式体现的&#xff0c;提示不友好&#xff0c;会导致效率降低 2 sql语句写在客户端&#xff0c;可以利用sql注入进行攻击&#xff0c;为了安全性&#xff0c;可以把sql封装在…

H3C防火墙安全授权导入

一、防火墙授权概述 前面我们已经了解了一些防火墙的基本概念&#xff0c;有讲过防火墙除了一些基本功能&#xff0c;还有一些高级安全防护&#xff0c;但是这些功能需要另外独立授权&#xff0c;不影响基本使用。这里以H3C防火墙为例进行大概了解下。 正常情况下&#xff0c;防…

01-prometheus监控系统-安装部署prometheus

一、准备环境 主机名ip配置prometheus-server3110.0.0.311核1g-20GBprometheus-server3210.0.0.311核1g-20GBprometheus-server3310.0.0.311核1g-20GB 二、下载/上传软件包 1&#xff0c;软件包地址 这里给大家准备了百度云盘的安装包&#xff1b; 链接&#xff1a;https:/…

upload-Labs靶场“1-5”关通关教程

君衍. 一、环境搭建二、第一关 前端JS检测后缀1、源码分析2、禁用浏览器JS上传3、burp抓包修改 三、第二关 MIME头验证1、源码分析2、burp抓包绕过 四、第三关 PHP3绕过1、源码分析2、PHP3绕过 五、第四关 .htaccess重写绕过1、源码分析2、.htaccess复写 六、第五关 黑名单大小…

VPP学习之配置VXLAN隧道

VPP学习之配置VXLAN隧道 一、VXLAN技术 VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN…

互动多媒体内容的魔法:如何让你的网页活起来

互动多媒体内容的魔法&#xff1a;如何让你的网页活起来 前言 在之前的文章中&#xff0c;我们探讨了网页结构中的基础介绍&#xff0c;本文将介绍如何通过简单的交互增强用户体验&#xff0c;包括图像大小的动态切换&#xff0c;以及音视频内容的播放控制来介绍网页多媒体的具…

测试:4核8G服务器并发数,支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

出现 ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的解决方法(图文界面)

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 由于Java转全栈,对此前端的细节点都比他人更加注意,所以此处记录更有用的信息!(小白都能看懂) 1. 问题所示 出现如下问题: F:\vue_project>vue -version vue 不是内部或外部命令,也不是可运行的程序 或批处理文件…

网关kong记录接口处理请求和响应插件 tcp-log-with-body的安装

tcp-log-with-body 介绍 Kong的tcp-log-with-body插件是一个高效的工具&#xff0c;它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景&#xff0c;尤其是在调试和排查问题时。 软件环境说明 kong version 2.1.4 - 2.8.3 [可用亲测]C…

Windows Docker 部署 Redis

部署 Redis 打开 Docker Desktop&#xff0c;切换到 Linux 内核。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 redis 服务 docker run -d --name redis -p 6379:6379 redis-如果需要自启动&#xff0c;加 --restart always 参数即可。 连接 Redis 使用客户端连…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…