input file结合vue3和vant实现上传图片效果,并显示上传进度百分比%

这里写自定义目录标题

  • 采用的dom结构是input file,label事件绑定,一下为代码
    • 传入参数为uploadNum
    • 实现效果如图
      • 上传中,图片1
      • 上传成功,图片2

采用的dom结构是input file,label事件绑定,一下为代码

传入参数为uploadNum

<template><div class="my-img-upload"><van-space wrap><!-- 图片列表 --><divclass="uploader-upload uploader-upload-list"v-for="(imgItem, index) in imgArr":key="index"><label class="uploader-icon-wrap"><van-icon name="photograph" color="#dcdee0" /></label><div v-if="imgItem.status != 'success'" class="loading-wrap"><van-loading color="#ffffff" size="22" /><div class="text">上传中{{ imgItem.progress }}%</div></div><div class="img-wrap" v-else @click="preImg(index)"><img :src="imgItem.url" alt="" style="width: 100%" /><div class="del-icon" @click.stop="delImg(index)"><van-icon name="cross" size="12px" color="#ffffff" /></div></div></div><!-- 上传的操作 --><div class="uploader-upload"><label class="uploader-icon-wrap" for="uploader-ipt"><van-icon name="photograph" color="#dcdee0" /></label><inputtype="file"id="uploader-ipt"class="uploader-input"accept="image/*"@change="changeFileInfo"/></div></van-space></div>
</template><script setup>
import axios from "axios";
import xToast from "@/util/toast.js";
import { showImagePreview } from "vant";
import { ref } from "vue";const props = defineProps({uploadNum: {// 上传图片的数量type: Number,default() {return 10;},},
});const imgArr = ref([]);// 预览图片
function preImg(index) {const imgUrlList = imgArr.value.map((item) => item.url);showImagePreview({images: imgUrlList,startPosition: index,});
}// 删除图片
function delImg(index) {imgArr.value.splice(index, 1);
}function changeFileInfo(e) {if (imgArr.value.length >= props.uploadNum) {xToast.show({type: "error",content: `最多上传${props.uploadNum}张图片`,});return false;}const files = e.target.files;const oFile = files[0];if (!isImageFile(files[0].name)) {xToast.show({type: "error",content: "请选择图片文件",time: 3000,});return false;}let objImage = {url: URL.createObjectURL(oFile),name: oFile.name,status: "uploading",statusbar: "上传中...",progress: 0,};imgArr.value.push(objImage);upLoadRequest(oFile);
}function upLoadRequest(file) {const dataFile = new FormData();dataFile.append("file", file);return new Promise((resolve, reject) => {axios({method: "post",url: "/api/upload", // 大概率需要代理headers: {"Content-Type": "multipart/form-data",},data: dataFile,onUploadProgress: function (progressEvent) {const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);imgArr.value[imgArr.value.length - 1].progress = percentCompleted;},}).then((res) => {if (res.code == 200) {// 注意这里可能需要根据实际响应结构调整imgArr.value[imgArr.value.length - 1] = {progress: 100,url: res.data.fileId,status: "success",message: "上传成功",};resolve();} else {imgArr.value.splice(imgArr.value.length - 1, 1);xToast.show({type: "error",content: "上传失败",time: 3000,});reject(new Error("上传失败"));}}).catch((error) => {imgArr.value.splice(imgArr.value.length - 1, 1);console.error("上传过程中发生错误:", error);xToast.show({type: "error",content: "上传过程中发生错误",time: 3000,});reject(error);});});
}function isImageFile(filename) {// 定义常见的图片格式扩展名const imageExtensions = [".jpg",".jpeg",".png",".gif",".bmp",".webp",".svg",".tiff",".ico",];const extension = filename.split(".").pop().toLowerCase();return imageExtensions.includes(`.${extension}`);
}
</script>
<style lang="less" scoped>
.my-img-upload {display: flex;margin-bottom: 20px;.uploader-upload {width: 80px;height: 80px;background: #fff;position: relative;.img-wrap {position: absolute;left: 0;top: 0;z-index: 100;width: 100%;height: 100%;font-size: 0;display: flex;align-items: center;justify-content: center;background-color: #ffffff;overflow: hidden;img {max-width: 100%;max-height: 100%;}.del-icon {position: absolute;right: 0;top: 0;z-index: 100;background-color: rgba(0, 0, 0, 0.7);border-radius: 0 0 0 12px;width: 15px;height: 15px;text-align: right;}}.loading-wrap {position: absolute;left: 0;top: 0;z-index: 100;width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;background-color: rgba(50, 50, 51, 0.88);flex-direction: column;.text {font-size: 0.32rem;color: #fff;margin-top: 4px;}}.uploader-icon-wrap {position: absolute;z-index: 10;left: 0;top: 0;width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}.uploader-input {width: 100%;opacity: 0;}}
}
</style>

实现效果如图

上传中,图片1

在这里插入图片描述

上传成功,图片2

在这里插入图片描述

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

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

相关文章

SELECT 语句详解

开发准备 注:如果你是从上一节直接进入本节进行学习的,请先删除上一节建立的数据库mysql_shiyan,删除语句为DROP DATABASE mysql_shiyan;。在正式开始本实验内容之前,需要先下载相关数据库表,搭建好一个名为mysql_shiyan 的数据库(有三张表:department,employee,projec…

重力传感器算法概述!

一、核心技术 高精度重力测量技术&#xff1a; 无人机重力传感器的核心技术之一是能够高精度地测量重力加速度数据。这通常依赖于先进的传感器设计和制造工艺&#xff0c;以确保传感器具有高度的灵敏度和稳定性。 例如&#xff0c;中国船舶第七〇七研究所自主研发的低空重力…

炼码LintCode--数据库题库(级别:中等;数量:更新中~)--刷题笔记_03

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;中等&#xff1b;数量&#xff1a;更新中~&#xff09;--刷题笔记_033617 更换连续两个人的座位&#xff08;case when&#xff09;题&#xff1a;sql&#xff1a;解释&#xff1a; 3615 数据中位数&#xff08;窗…

【stm入门学习SPI_铁头山羊系列教程】

stm入门学习SPI_铁头山羊教程 1.SPI总线1.电路结构与通信协议2.SPI的特点&#xff1a;3. 极性 相位4. 4中时钟模式5. 比特位的传输模式6.数据宽度 2. SPI引脚IO引脚初始化 1.SPI总线 1.电路结构与通信协议 主机向从机NSS引脚发送低电压&#xff0c;选中该从机。 主机通过向MOS…

RK3568平台开发系列讲解(platform虚拟总线驱动篇)实验:点亮一个LED

🚀返回专栏总目录 文章目录 一、设备树二、平台驱动三、应用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢xxx 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的属性,编写测试应用程序。 • 首先向设备树添加 LED 设备节点…

Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果

引言 在现代的分布式系统和微服务架构中&#xff0c;数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL 数据库的 binlog&#xff08;二进制日志&#xff09;功能能够记录所有对数据库的修改操作&#xff0c;如插入&#xff08;INSERT&#xff09;、更新&…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

PlantUML——时序图

PlantUML时序图 背景 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图&#xff0c;用于描述对象之间发送消息的时间顺序&#xff0c;显示多个对象之间的动态协作。时序图的使用场景非常广泛&#xff0c;几乎各行各…

算法——链表相交(leetcode23)

链表相交这题就是找出两个相交链表相交的节点并返回 如上图假设上方第一个节点是链表A的头结点下方第一个节点是链表B的头结点 解法有以下两种 方法一(移动长链表指针后同步移动两个链表的指针直至相等) 也就是先遍历链表A和链表B的长度接着得到链表A和B长度的差值然后领长链…

STM32单片机锁死

自己画了一块stm32f407板子&#xff0c;外部晶振用了25MHz&#xff0c;烧写了8MHz的程序&#xff0c;第一次烧写成功&#xff0c;第二次开始识别不到芯片&#xff0c;第一次烧写成功由于外部晶振为25Hz&#xff0c;芯片内频率计算器却是按照8MHz写的&#xff0c;所以得出最后的…

Windows文件资源管理器增强工具

引言&#xff1a; 资源管理器在我们使用电脑时是经常用到的&#xff0c;各种文件资源等的分类整理都离不开它。但是Windows Explorer确实不好用&#xff0c;不智能&#xff0c;不符合人体工程学。特别是在一些场合&#xff0c;在打开的一堆文件夹里&#xff0c;想从中找到自己要…

聚类中3个解空间的描述

深度学习中做分类任务时&#xff0c;我们常常根据最后的全连接层得到一组向量A&#xff08;比如&#xff1a;[0.9, 0.7, 0.2]&#xff09;&#xff0c;这组向量经过归一化得到向量B(比如&#xff1a;[0.5&#xff0c; 0.3&#xff0c; 0.2])&#xff0c;再根据B向量采用概率最大…

Empirical analysis of hardware-assisted GPU virtualization

​ 年份&#xff1a;2019 作者&#xff1a;Anshuj Garg 会议&#xff1a;ESCI 出版商&#xff1a;IEEE 摘要 本篇文章对vGPU虚拟化的性能开销、调度算法的影响、同构与异构工作负载的干扰效应&#xff0c;以及PCI直通与vGPU的性能差异进行了研究。结果表明&#xff0c;vGP…

Java面试题2024-Java基础

Java基础 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、…

【案例分享】运用 Infragistics Ultimate UI 让工业物联网 IIoT 数据流更易于访问

客户概况 贝克休斯旗下的 Bently Nevada 是状态监测和资产保护领域的全球领导者。该公司拥有 60 多年的专业知识&#xff0c;在全球安装了超过 600 万个传感器和 100,000 个机架监测系统。 如今&#xff0c;Bently Nevada的开发团队正在使用现代 UI 工具包来增强他们的系统&a…

PHM技术:基于支持向量机的智能故障诊断 | 行星齿轮箱智能故障诊断

目录 1.数据获取 2.特征提取与选择 3.健康状态识别 1.数据获取 用的行星齿轮箱数据采集自图1中的多级齿轮传动系统实验台中&#xff0c;在实验过程中&#xff0c;分别模拟了8种行星齿轮箱的健康状态&#xff0c;包括正常、第一级太阳轮点蚀、第一级太阳轮齿根裂纹、第一级…

推荐一款Windows系统精简工具:NTLite

NTLite是一款可以对Windows系统优化的安装工具&#xff0c;使用这款完全中文的NTLite授权注册版让你不会因为注册或者语言导致无法正常的使用&#xff0c;如果你正需要马上下载使用吧。 NTLite基本简介 NTLite 中文版可以用来做什么&#xff0c;它其实是一款 Windows 系统精简…

ESP-IDF VScode 项目构建/增加组件 新手友好!!!

项目构建 1.新建文件夹&#xff0c;同时在该文件夹内新建.c和.h文件 如图所示&#xff0c;在components中新建ADC_User.c、ADC_User.h、CMakeLists.txt文件。当然这里你也可以不在components文件夹内新建文件&#xff0c;下面会说没有在components文件夹内新建文件构建项目的方…

Node Exporter 可观测性最佳实践

Node Exporter 介绍 Node Exporter 是一个开源的 Prometheus 指标收集器&#xff0c;它提供了大量关于宿主机系统的关键指标&#xff0c;如 CPU、内存、磁盘和网络使用情况。在 Kubernetes 环境中&#xff0c;Node Exporter 对于监控集群节点的健康状况至关重要。本文将介绍如…

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…