el-upload上传图片和视频,支持预览和删除

话不多说, 直接上代码:

视图层:

        <div class="contentDetail"><div class="contentItem"><div style="margin-top:5px;" class="label csAttachment">客服上传图片:</div><el-upload:auto-upload="false":limit="10":on-change="fileChange":on-remove="handleRemoveImg":file-list="csImages"action="#"accept=".jpg,.jpeg,.png"list-type="picture-card"><i slot="default" class="el-icon-plus"></i><div slot="file" slot-scope="{ file }"><img :src="file.url" class="el-upload-list__item-thumbnail" alt="" /><div class="el-upload-list__item-actions"><span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"><i class="el-icon-zoom-in"></i></span><span class="el-upload-list__item-delete" @click="handleRemoveImg(file)"><i class="el-icon-delete"></i></span></div></div></el-upload></div></div><div class="contentDetail"><div class="contentItem"><div class="label csAttachment">客服上传视频:</div><el-upload:auto-upload="false":limit="3":on-change="changeUploadVideo":file-list="csVideos"class="avatar-uploader"action="#"list-type="picture-card"><i slot="default" class="el-icon-plus"></i><div slot="file" slot-scope="{ file }"><video:src="file.url":style="{width: csVideos.length > 0 ? '200px' : 0,height: csVideos.length > 0 ? '120px' : 0}"class="video-avatar"controls="controls"><span>您的浏览器不支持视频播放</span></video><div class="el-upload-list__item-actions" style="z-index:101;height:50px;"><span class="el-upload-list__item-delete" @click="handleRemoveVideo(file)"><i class="el-icon-delete"></i></span></div></div></el-upload></div></div>

逻辑层:

// 监听附件相关数据 
watch: {// 新增图片fileList: {async handler(newList) {this.fileData.imgFiles = []if (newList.length) {let fileObj = {}await newList.map(file => {// 上传的文件流转为base64格式if (file.raw) {getBase64File(file.raw).then(res => {fileObj = {fileName: file.name,fileBase64: res}this.fileData.imgFiles.push(fileObj)})} else {fileObj = {fileBase64: file.fileBase64,fileName: file.name,type: file.type}this.fileData.imgFiles.push(fileObj)}})}}},// 删除已上传图片时newImgList: {handler: function(list) {let obj = {fileBase64: '',fileName: '',type: ''}list.map(file => {obj = {fileBase64: file.fileBase64,fileName: file.name,type: file.type}})this.fileData.imgFiles.push(obj)}},//添加视频videoList: {async handler(newList) {this.fileData.videoFiles = []if (newList.length) {let fileObj = {}await newList.map(file => {// 上传的文件流转为base64格式if (file.raw) {getBase64File(file.raw).then(res => {fileObj = {fileName: file.name,fileBase64: res}this.fileData.videoFiles.push(fileObj)})} else {fileObj = {fileBase64: file.fileBase64,fileName: file.name,type: file.type}this.fileData.videoFiles.push(fileObj)}})}}},// 删除已上传视频时newVideoList: {handler: function(list) {let obj = {fileBase64: '',fileName: '',type: ''}list.map(file => {obj = {fileBase64: file.fileBase64,fileName: file.name,type: file.type}})this.fileData.videoFiles.push(obj)}}},  // 添加图片文件fileChange(file, fileList) {this.fileList = fileListthis.fileList.map((item, index) => {const fileSize = item.size / 1024 / 1024if (fileSize > 20) {this.$message.error('单个附件大小不能超过20M')this.fileList.splice(index, 1)}})setTimeout(() => {this.editFile('image')}, 1000)},// 添加视频文件changeUploadVideo(file, fileList) {const fileSize = file.size / 1024 / 1024 <= 50if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'video/mov'].indexOf(file.raw.type) == -1 // 控制格式) {this.$message.error('请上传正确的视频格式')return false}if (!fileSize) {this.$message.error('视频大小不能超过50MB')return false}this.videoList = fileListsetTimeout(() => {this.editFile('video')}, 1000)},// 移除图片文件handleRemoveImg(file) {this.fileList.map((item, index) => {if (item.name === file.name) {// 回显图片时if (item.type === 2) {item.type = 1 // 2 保留 1 删除this.newImgList = this.fileList.splice(index, 1)setTimeout(() => {this.editFile('image')}, 500)} else {// 新增图片时this.fileList.splice(index, 1)}}})},// 移除视频文件handleRemoveVideo(file) {this.videoList.map((item, index) => {if (item.name === file.name) {// 回显视频时if (item.type === 2) {item.type = 1 // 2 保留 1 删除this.newVideoList = this.videoList.splice(index, 1)setTimeout(() => {this.editFile('video')}, 500)} else {// 新增视频时this.videoList.splice(index, 1)}}})},// 预览图片handlePictureCardPreview(file) {this.dialogImageUrl = file.urlthis.$alert(`<img src="${this.dialogImageUrl}" width="100%">`, {dangerouslyUseHTMLString: true,callback: () => {}})},// 编辑附件editFile(type) {const params = {imgFiles: this.fileData.imgFiles,videoFiles: this.fileData.videoFiles,csClass: this.summaryDetail.csClassIds[this.summaryDetail.csClassIds.length - 1],csFeedbackDescribe: this.summaryDetail.csFeedbackDescribe,id: this.summaryDetail.id,role: 1,appPhone: this.summaryDetail.appPhone,sn: this.summaryDetail.sn,qrCode: this.summaryDetail.qrCode,iscallBack: 1 // 是否编辑回电  1否 2是}this.$confirm('确认修改?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {this.loading = trueaddSummary(params) // 后端接口.then(res => {if (res.code === 0) {this.getSummaryList(this.activeName)this.$message.success(res.msg)}}).catch(() => {this.loading = false// 添加修改失败,恢复原有数据if (type === 'image') {this.csImages = handleFileFormat(this.summaryDetail.csImgFiles)} else {this.csVideos = handleFileFormat(this.summaryDetail.csVideoFiles)}})}).catch(() => {// 取消添加修改,恢复原有数据if (type === 'image') {this.csImages = handleFileFormat(this.summaryDetail.csImgFiles)} else {this.csVideos = handleFileFormat(this.summaryDetail.csVideoFiles)}})}

上传附件没有使用单独的上传接口,是调用添加记录接口时,统一传参保存。添加接口请求成功后再回显。

因为我们的需求是在详情页面也能编辑图片和视频,所以加了`type`字段,1代表删除,2代表保留,添加的话就不传。如果你们的需求没有在详情编辑的功能,相关的逻辑可以不用管。

添加失败或取消添加时,恢复原有数据。

视频的时候需要注意:video标签的层级比较高,鼠标hover时上面的删除图标显示不出来,手动修改它们的`z-index`,比如:

 

 删除图标的容器宽度也修改下,否则会覆盖视频播放按钮。

样式设置:

/deep/ .el-upload--picture-card {width: 80px;height: 80px;}/deep/ .el-upload-list__item {width: 80px;height: 80px;}.avatar-uploader {/deep/ .el-upload--picture-card {display: inline-block;width: 200px;height: 120px;}/deep/ .el-upload-list__item {display: inline-block;width: 200px;height: 120px;}}video {display: inline-block;position: relative;z-index: 100;}/deep/ .el-icon-plus {position: relative;top: -35%;}.avatar-uploader {/deep/ .el-icon-plus {position: relative;top: -6%;}}

上传前: 

 上传后:

 

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

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

相关文章

iOS--KVO和KVC

KVC 简单介绍 KVC的全称是KeyValueCoding&#xff0c;俗称“键值编码”&#xff0c;可以通过一个key来访问某个属性&#xff1b; KVC提供了一种间接访问其属性方法或成员变量的机制&#xff0c;可以通过字符串来访问对应的属性方法或成员变量&#xff1b; 它是一个非正式的…

大数据课程C4——ZooKeeper结构运行机制

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Zookeeper的特点和节点信息&#xff1b; ⚪ 掌握Zookeeper的完全分布式安装 ⚪ 掌握Zookeeper的选举机制、ZAB协议、AVRO&#xff1b; 一、Zookeeper-简介 1. 特点…

vue build 打包遇到bug解决记录

文章目录 vue-cli-service servevue打包修改dist文件夹名字vue build require is not defined 和 exports is not defind 错误 vue-cli-service serve 通常vue是不能直接使用vue-cli-service命令在终端运行的&#xff0c;所以才会在package.json中配置了scripts&#xff1a; …

JDBC的的使用

首先导入jar包。 https://downloads.mysql.com/archives/c-j/ package com.test.sql;import java.sql.*;public class StudySql {public static void init() throws SQLException {Statement stmt null;Connection conn null;ResultSet res null;PreparedStatement pstm…

自动化运维工具—Ansible概述

Ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、…

CTFshow web入门 爆破

web21 bp 攻击模块的迭代器 输入账号密码 抓包 发现下面存在一个base64编码 我输入的是 123 123 发现就是base加密 账号 密码 那我们怎么通过intruder模块 自动变为 base64呢 然后去payload------>custom iterator(自定义迭代器) 位置1导入admin 因为是 账号:密码 这…

微服务远程调用openFeign简单回顾(内附源码示例)

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

win 安装虚拟机 再安装macos

0 视频教程 windows虚拟机一键安装苹果系统macos&#xff0c;轻松拥有xcode环境_哔哩哔哩_bilibili在windows环境下vmware虚拟机一键安装macos Catalina10.15.7苹果系统&#xff0c;帮助学习ios编程的朋友们实现xcode环境。文字教程&#xff1a;https://www.dhzy.fun/archives…

Prometheus 的应用服务发现及黑河部署等

目录 promtool检查语法 部署Prometheus Server 检查语法是否规范 部署node-exporter 部署Consul 直接请求API进行服务注册 使用register命令注册服务&#xff08;建议使用&#xff09; 单个和多个注册&#xff0c;多个后面多加了s 在Prometheus上做consul的服务发现 部署…

IL汇编字符串连接

在此实现了一个基本的IL汇编程序&#xff1b; 了解MSIL汇编和IL汇编评估堆栈_bcbobo21cn的博客-CSDN博客 它用了下面两句来在屏幕输出字符串&#xff0c; ldstr "I am from the IL Assembly Language..." call void [mscorlib]System.Console::WriteLine (string) …

用i18next使你的应用国际化-React

ref: https://www.i18next.com/ i18next是一个用JavaScript编写的国际化框架。 i18next为您提供了一个完整的解决方案&#xff0c;本地化您的产品从web端到移动端和桌面端。 在react项目中安i18next依赖&#xff1a; i18nextreact-i18nexti18next-browser-languagedetector&…

Spring(二):更简单的存储与读取 Bean

通过上一章的Spring&#xff0c;我们基本实现了Spring 的读取与存储&#xff0c;但是在操作过程中&#xff0c;读取与存储并没有那么得“简单” 一套流程还是很复杂&#xff0c;所以&#xff0c;本章来介绍更加简单得读取与存储。 在 Spring 中想要更简单的存储和读取对象的核…

mysql通过binlog恢复数据

开启binlog 在my.ini中添加以下两行代码&#xff1a; log-binmysql-binserver-id1 注意要写在[mysqld]范围内才会生效 查看binlog存放日志文件目录 show variables like %datadir%; 查看binlog文件名 show master logs; 将binlog转换成sql mysqlbinlog --no-defaults --bas…

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值&#x1f512;题目&#x1f511;题解 搜索二维矩阵II&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维…

SpringMVC程序开发

1.什么是Spring MVC? Spring Web MVC是基于Servlet API构建的原始的Web框架&#xff0c;从一开始是就包含在Spring框架中。它的正式名称“Spring Web MVC"来自其源模板的名称&#xff08;Spring-webmvc)&#xff0c;但通常被称为“Spring MVC" 从上述的定义我们可…

[visionOS][Apple Vision Pro] 缩放3D模型

方法一&#xff1a;通过代码来设置Model3D Model3D(named:"你的3D模型名称",bundle:realityKitContentBundle).padding(.bottom,50).scaleEffect(0.2) //这句用来缩放 方式二&#xff1a;别人可以&#xff0c;我验证过不行的方法 RealityKitContent工具中&#xf…

PLC-Recorder的高速采集有多快?0.5ms算快吗?看控制器能力了!

大家知道&#xff0c;PLC-Recorder有一个高速采集的功能&#xff0c;基于TCP连接或UDP报文&#xff0c;速度取决于发送端的能力。对于西门子PLC&#xff0c;能做到1-2ms的采集速度&#xff0c;但是&#xff0c;我在前面的文章里提到了0.5ms的高速采集&#xff0c;哪个控制器能这…

Linux 下 nc 发送接收 udp、tcp数据

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注&#xff1a;这种方式只能发…

Django实现音乐网站 ⑴

使用Python Django框架制作一个音乐网站。 目录 网站功能模块 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 后台管理 创建管理员账户 启动服务器 登录网站 配置时区…

自媒体必备的8个素材网站,视频、音效、图片全部免费下载

自媒体必备的视频、音效、图片素材&#xff0c;这8个网站帮你解决。赶紧马住&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是一个设计网站&#xff0c;但它还有非常丰富的视频和音频素材&#xff0c;视频素材全部都是高清无水印&#…