el-upload 组件上传/移除/报错/预览文件,预览图片、pdf 等功能

目录

  • 页面代码
  • 样式代码
  • 页面展示

页面代码

dialog.vue

<!-- 上传文件 -->
<template><el-dialogtitle="上传文件":visible.sync="dialogVisible"width="60%"top="6vh":close-on-click-modal="false"@close="handleClose"><ele-formref="submitRef"v-model="formData"inline:form-desc="formDesc":request-fn="handleSubmit":is-show-submit-btn="true":is-show-cancel-btn="true"submit-btn-text="确定":is-show-error-notify="false"@cancel="handleClose"><template v-slot:attachmentList><el-uploadref="uploadRef"v-loading="uploadLoading"class="upload_demo"list-type="picture-card":accept="fileTypeList.join(',')"action="/supervise_basic/upload/oss/fileupload"name="files"multiple:file-list="fileList":headers="{ 'X-Token': getToken() }":data="{ relativePath: 'SCWS/' }":on-success="onSuccessHandler":on-error="onErrorHandler":on-remove="onRemoveHandler":before-upload="beforeUploadHandler"><i slot="default" class="el-icon-plus" /><div slot="file" slot-scope="{ file }" class="el_upload_preview_list"><!-- pdf 文件展示文件名 --><div v-if="['application/pdf'].includes(file.raw.type)" class="pdfContainer">{{ file.name }}</div><!-- 图片预览 --><el-imagev-else:id="'image' + file.uid"class="el-upload-list__item-thumbnail":src="file.url":preview-src-list="[file.url]"/><span class="el-upload-list__item-actions"><span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"><i class="el-icon-zoom-in" /></span><span class="el-upload-list__item-delete" @click="onRemoveHandler(file)"><i class="el-icon-delete" /></span></span></div><template v-slot:tip><div class="el_upload_tip">仅支持上传{{ fileTypeList.join('/') }}格式文件,且不超过{{ fileMaxSize }}MB。</div></template></el-upload></template></ele-form></el-dialog>
</template><script>
import _ from 'lodash.clonedeep'
import { getToken } from '@/utils/tool'
import { uploadBloodFile } from '@/api/blood_api.js'export default {name: 'UploadFileDialog',components: {},data() {return {dialogVisible: true,rowData: {},formData: {attachmentList: []},uploadLoading: false,fileTypeList: ['.png', '.jpg', '.jpeg', '.pdf'],fileMaxSize: 5,fileList: [],getToken}},computed: {formDesc() {return {xbrq: {type: 'date',layout: 24,label: '日期',required: true,attrs: {valueFormat: 'yyyy-MM-dd'},class: {textareaTop: true},style: {marginBottom: '10px'}},attachmentList: {type: 'upload',layout: 24,label: '上传文件',required: true}}}},watch: {dialogVisible() {this.$refs.submitRef &&this.$refs.submitRef.$refs.form &&this.$refs.submitRef.$refs.form.clearValidate()}},created() {const list = []this.fileTypeList.forEach((item) => {list.push(item, item.toUpperCase())this.fileTypeList = list})},methods: {open(rowData) {console.log('rowData----', rowData)this.rowData = _(rowData)this.dialogVisible = true},beforeUploadHandler(file) {const ext = file.name.substring(file.name.lastIndexOf('.'))const isLt = file.size / 1024 / 1024 < this.fileMaxSizeif (!this.fileTypeList.includes(ext)) {this.$message.error(`请上传${this.fileTypeList.map((item) => item)}格式的文件!`)return false // 会调用 on-remove 钩子} else if (!isLt) {this.$message.error('上传文件大小不能超过 5MB!')return false // 会调用 on-remove 钩子} else {this.uploadLoading = truereturn true}},onRemoveHandler(file, fileList) {/*** fileList 有无值取决于是上传失败调用 on-remove 钩子,还是手动点击删除按钮删除文件,详细解释如①②:*    ① 如果文件上传失败(before-upload 中return false)会自动调用 on-remove 钩子(不用我们自己处理删除文件),此时第二个参数 fileList 有值(为数组);*    ② 如果手动点击删除文件按钮删除,此时 fileList 是没有的,为 undefined;*    因此通过 fileList 来判断是否执行 on-remove 钩子中我们自己处理移除文件(避免:已经上传了N张图片后,上传不符合要求的图片时调用当前方法导致第 N-1 张图片被删除)*/if (fileList) returnconst { uploadFiles } = this.$refs.uploadRefuploadFiles.splice(uploadFiles.findIndex((item) => item.uid === file.uid),1)this.formData.attachmentList.splice(this.formData.attachmentList.findIndex((item) => item.uid === file.uid && item.filename === file.name),1)this.$refs.submitRef &&this.$refs.submitRef.$refs.form &&this.$refs.submitRef.$refs.form.validateField('attachmentList')},// eslint-disable-next-line handle-callback-erronErrorHandler(err, file, fileList) {this.uploadLoading = falsethis.$message.error(`${file.name}文件上传失败,请重新上传!`)},// 文件上传成功onSuccessHandler(response, file) {this.uploadLoading = falseconsole.log('response----', response)const fileList = response.data.fileUploadInfoList? response.data.fileUploadInfoList.map((item) => {return {filename: item.filename,saved_filename: item.path,filetype: item.fileType,uid: file.uid}}): []this.formData.attachmentList.push(...fileList)// 部分表单校验this.$refs.submitRef &&this.$refs.submitRef.$refs.form &&this.$refs.submitRef.$refs.form.validateField('attachmentList')},// 预览 pdf、图片handlePictureCardPreview(file) {// 预览pdfif (['application/pdf'].includes(file.raw.type)) {window.open(file.url)return}// 预览文件const imageDom = document.getElementById('image' + file.uid)imageDom && imageDom.click()},handleSubmit() {this.$refs.submitRef.validate().then((valid) => {const { id, voucher_no } = this.rowDataconst { attachmentList, xbrq } = this.formDataconst params = {id,voucher_no,xgws: attachmentList.map((item) => {return {wsmc: item.filename,wsdz: item.saved_filename,xbrq: xbrq}})}uploadBloodFile(params).then((res) => {this.$common.CheckCode(res, res.msg || '上传成功', () => {this.handleClose()this.$emit('update')})})})},handleClose() {this.rowData = {}for (const key in this.formData) {if (this.formData[key] && this.formData[key].constructor === Array) {this.formData[key] = []} else if (this.formData[key] && this.formData[key].constructor === Object) {this.formData[key] = {}} else {this.formData[key] = ''}}this.dialogVisible = false}}
}
</script><style lang='scss' scoped>
@import '@/styles/dialog-style.scss';
</style>

样式代码

@/styles/dialog-style.scss

::v-deep .el-dialog {min-width: 760px;.el-dialog__header {font-weight: 700;border-left: 3px solid #00a4ff;}.el-dialog__headerbtn {top: 13px;}.ele-form {.el-form-item__error {top: 75%;}.el-form-item {margin-bottom: 0;}.ele-form-btns {width: 100%;.el-form-item__content {text-align: right;}}// ele-form 表单项为 textarea 时,当前表单项和上一个表单项校验提示文字位置调整.textareaTop {& + .el-form-item__error {// 上一个表单项检验提示文字位置top: 65% !important;}}.currentTextarea {& + .el-form-item__error {// 当前 textarea 表单项检验提示文字位置top: 92% !important;}}}.upload_demo {margin-top: 8px;& + .el-form-item__error {top: 156px !important;}}
}.dialog_section_title {margin: 10px -20px;padding: 10px 20px;// background-color: #eee;border-top: 1px solid #eee;border-bottom: 1px solid #eee;border-left: 3px solid #00a4ff;font-weight: 700;text-align: left;
}.noData {padding: 10px 0;text-align: center;color: #ccc;
}.el_upload_tip {margin-top: 15px;line-height: 20px;text-align: left;color: red;
}.el_upload_preview_list {height: 100%;// el-uplaod组件卡片预览类型预览pdf样式.pdfContainer {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}
}.blue-theme {.dialog_section_title {border-top: 1px solid #202936;border-bottom: 1px solid #202936;}
}.night-theme {.dialog_section_title {border-top: 1px solid #202936;border-bottom: 1px solid #202936;}
}

页面展示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Python JSON 使用指南:解析和转换数据

JSON 是一种用于存储和交换数据的语法。JSON 是文本&#xff0c;使用 JavaScript 对象表示法编写。 Python 中的 JSON Python 有一个内置的 json 包&#xff0c;可用于处理 JSON 数据。 示例&#xff1a;导入 json 模块&#xff1a; import json解析 JSON - 从 JSON 转换为…

重温云栖,分享十年成长:我和云栖的故事

文章目录 前言活动背景我和云栖的交际历届峰会主题2009201020112012201320142015201620172018202120222023 技术带来的变化工作生活关注的领域 后记 前言 云栖大会&#xff0c;前身可追溯到2009年的地方网站峰会&#xff0c;2011年演变为阿里云开发者大会&#xff0c;2015年正式…

OpenCV标定演示,及如何生成标定板图片

标定的程序在官方的源码里有&#xff0c; opencv-4.5.5\samples\cpp\tutorial_code\calib3d\camera_calibration 很多小白不知道怎么跑起来&#xff0c;这个也怪OpenCV官方&#xff0c;工作没做完善&#xff0c;其实的default.xml是要自己手动改的&#xff0c;输入的图片也要…

在Maven中发布项目到Nexus私有服务器

一、测试环境 Sonatype Nexus 3.61.0-02 Maven 3.9.2 二、环境配置 2.1找到maven的配置文件 2.2添加私有仓库账户密码 <servers><server><id>nexus</id><username>admin</username><password>admin</password></server&…

rfsoc FPGA 49DR 16收16发模块

前面简单介绍过RFSOC板卡 https://blog.csdn.net/jingjiankai5228/article/details/114734631 整体来说RFSOC降低了传统AD DA软硬件开发难度&#xff0c;但是同样存在整数点FS/N谐波大的问题 交织采样是通过多个AD拼接完成的&#xff0c;所以校准比较关键&#xff0c;和以前常…

【React】03.脚手架的进阶应用

文章目录 暴露webpack配置暴露前后的区别config文件夹&#xff1a;scripts文件夹&#xff1a;package.json 常见的配置修改1.把sass改为less2.配置别名3.修改域名和端口号4.修改浏览器兼容5.处理Proxy跨域 2023年最新珠峰React全家桶【react基础-进阶-项目-源码-淘系-面试题】 …

【0基础学Java第五课】-- 方法的使用

5. 方法的使用 5.1 什么是方法5.2 方法定义5.3方法调用的执行过程例题&#xff1a;求n的阶乘和 5.4 实参和形参的关系&#xff08;重点&#xff09;5.5 没有返回值的方法5.6 方法重载5.7 方法签名5.8 递归5.9 递归练习按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)递归…

每天学习都很累,该怎么办?

中考淘汰一批人&#xff0c;高考又淘汰一批人&#xff0c;能杀进大学的&#xff0c;都知道高考的累。好不容易进了大学&#xff0c;却发现仍有打卡、作业、考试。 加上每天满满的课表&#xff0c;只是看看就让人心累。 为了奖学金或升学就业&#xff0c;又得去卷绩点、卷比赛、…

计算机毕业设计选题推荐-超市售货微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

操作系统:文件管理(一)文件系统基础

一战成硕 4.1 文件系统基础4.1.1 文件的基本概念4.1.2 文件控制块和索引结点4.1.3 文件的操作4.1.4 文件保护4.1.5 文件的逻辑结构4.1.6 文件的物理结构 4.1 文件系统基础 4.1.1 文件的基本概念 文件是以硬盘为载体的存储在计算机上的信息的结合。 在系统运行时&#xff0c;计…

深度神经网络的数学原理:基于超平面、半空间与线性区域的表示

概述 以前的文章主要描述了神经网络&#xff0c;即多层感知机、全连接模型的运行原理&#xff0c;还是以实验为主&#xff0c;数学描述为辅的方式&#xff0c;这篇文章以纯数学的视角来描述神经网络的运行原理&#xff0c;主要以前馈过程为主&#xff08;反向传播的动力学过程…

深度学习入门(二)之神经网络

文章目录 从感知机到神经网络神经网络的例子复习感知机激活函数 激活函数sigmoid函数阶跃函数的实现阶跃函数的图形sigmoid函数的图形sigmoid函数与阶跃函数比较非线性函数ReLU函数 多维数组的运算多维数组矩阵乘法神经网络的内积 三层神经网络的实现符号确认各层间信号传递的实…

【51单片机】LED与独立按键(学习笔记)

一、点亮一个LED 1、LED介绍 LED&#xff1a;发光二极管 补&#xff1a;电阻读数 102 > 10 00 1k 473 > 47 000 2、Keil的使用 1、新建工程&#xff1a;Project > New Project Ctrl Shift N &#xff1a;新建文件夹 2、选型号&#xff1a;Atmel-AT89C52 3、xxx…

uniapp原生插件之视频图片选择安卓原生插件

插件介绍 本地相册图片和视频多选Android扩展原生插件 插件地址 视频图片选择安卓原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 插件申请权限 存储卡读写权限 manifest.json权限列表 /* android打包配置 */"android" : {"permission…

Mozilla Firefox 119 现已可供下载

Mozilla Firefox 119 开源网络浏览器现在可以下载了&#xff0c;是时候先看看它的新功能和改进了。 Firefox 119 改进了 Firefox View 功能&#xff0c;现在可以提供更多内容&#xff0c;如最近关闭的标签页和浏览历史&#xff0c;你可以按日期或网站排序&#xff0c;还支持查…

spring 和 idea 建议不要使用 @Autowired注解

spring 和 idea 建议不要使用 Autowired注解 一. 问题描述二. 警告原因和如何去除三. 个人的收获和解决方案3. 1 个人感受3.2 通过构造函数解决警告问题 四. 小知识4.1 使用Autowired还会出现循环依赖的问题么4.2 Autowired 和 Resource区别 前言 这是我在这个网站整理的笔记,有…

vivo 自研蓝河操作系统 BlueOS 发布:支持大模型、BlueXlink 协议实现万物互联

大家好&#xff0c;我是 Lorin , 2023 年 11 月 1 日&#xff0c;在今天的 2023 年 vivo 开发者大会上&#xff0c;vivo 自主研发的蓝河操作系统&#xff08;BlueOS&#xff09;正式亮相。这款操作系统被宣传为一款面向未来的智能操作系统&#xff0c;具备出色的支持能力&#…

PlantSimulation访问本地Excel文件的方法

PlantSimulation访问本地Excel文件的方法 PlantSimulation访问本地Excel文件的方法PlantSimulation访问本地Excel文件的方法 //Param StatusTable,T_DataTable:object var T_DataTable:object:=DataTable IF NOT isComputerAccessPermittedMESSageBox("计算机访问被阻止,…

maven:编译出现Process terminated解决方法(超全)

maven:编译出现Process terminated解决方法&#xff08;超全&#xff09; 一. 情况一&#xff1a;配置文件 settings. xml 出错&#xff08;解决方法1&#xff09;1.1 项目编译报错如下&#xff1a;1.2 点击【项目名】提示找到出错文件1.3 点击查看出错文件1.4 原因及解决办法 …

大模型推理最新论文及源码合集,涵盖多模态推理、逻辑推理、数学推理

大模型推理技术的发展帮我们解决了许多的难题&#xff0c;但如今的大模型在复杂推理上的表现仍然欠佳&#xff0c;为了突破这一瓶颈&#xff0c;研究者们提出了许多创新性的方法。 我整理了其中一部分个人认为很值得学习的论文来和大家分享&#xff0c;涵盖多模态推理、逻辑推…