如何封装一个上传文件组件

        #今天用el-upload感到很多不方便,遂决定自己封装一个。注:本文不提供表面的按钮样式和文件上传成功后的样式,需要自己创建。本文仅介绍逻辑函数#

1,准备几个表面用来指引上传的元素

2,创造统一的隐藏文件上传输入框,监听文件改变函数来监听文件的上传

    <input type="file"ref="fileInput" class="hidden" @change="handleFileUpload" :accept="currentFileType" 
/>

你放在哪里都行,反正要隐藏起来,用来调用点击事件

3,准备文件上传的Ref和上传成功的文件的数组,记得ref要绑定上面的输入框

  1. 创造ref绑定输入框,用于读取上传到文件相关信息
  2. 创建上传数组用于存放上传文件组合,有文件名字,文件类型,文件路径(图片和视频才有),文件大小
// 文件上传ref
const fileInput = ref<HTMLInputElement | null>(null)
// 上传的文件列表
const uploadedFiles = reactive<{name: string;type: 'file' | 'image' | 'video';url?: string;size: string;
}[]>([]);

4,点击表面的上传按钮时,调用隐藏的上传输入框的click事件

        事件要绑定在上面的隐藏输入框

const handleFile = () => {fileInput.value?.click()
}

5, 处理文件上传函数

  1.  如果文件数组为空则返回
  2. 检查文件大小,如果为video视频文件并且文件大小大于100MB同样返回
  3. 确定文件类型,同样使用startsWith函数
  4. 添加到文件上传列表中,包含名字,类型,创造的url(视频或图片才有),大小(格式化函数返回)
  5. 最后清除文件上传框
const handleFileUpload = (event: Event) => {const input = event.target as HTMLInputElement;if (!input.files || input.files.length === 0) {alert('您没有上传文件')return};Array.from(input.files).forEach(file => {// 检查视频文件大小if( file.type.startsWith('video/') && file.size > 100 * 1024 * 1024){alert(`视频文件${file.name}太大, 请限制在100MB以内`);return}// 确定文件类型let fileType: 'file' | 'image' | 'video' = 'file';if (file.type.startsWith('image/')) {fileType = 'image';} else if (file.type.startsWith('video/')) {fileType = 'video';}// 添加到上传列表uploadedFiles.push({name: file.name,type: fileType,url: fileType !== 'file' ? URL.createObjectURL(file) : undefined,size: formatFileSize(file.size)});alert(`已经添加:${file.name}`)})input.value = '';
}

6,格式化函数,用来计算文件大小,传入函数为文件的大小,单位B

  1. 定义大小四个单位
  2. 循环计算哪个大小单位,每次除以1024
  3. 最后返回得到的size是除完后的结果,toFixed保留一位小数
const formatFileSize = (bytes: number): string => {const units = ['B', 'KB', 'MB', 'GB']let size = byteslet unitIndex = 0while (size >= 1024 && unitIndex < units.length -1){size /= 1024unitIndex++;}return `${size.toFixed(1)} ${units[unitIndex]}`
}

7, 删除文件函数,需要绑定在删除元素上

比如绑定在文件删除按钮,点击时触发,传入文件数组的对应索引

  1. 如果对应文件存在URL路径,需要统一肢解路径,使用函数URL.revokeObjectURL(对应url字符串)
  2. splice根据索引删除对应元素
const removeFile = (index:number) =>{if (uploadedFiles[index].url)URL.revokeObjectURL(uploadedFiles[index].url)uploadedFiles.splice(index, 1)alert.warning('已删除文件')
}

8,清除函数,在组件销毁前调用

同第七条,在组件关闭前调用URL.revokeObjectURL函数解放url,防止永远无法复用

// 清理函数
const cleanupBlobUrls = () =>{uploadedFiles.forEach(file => {if (file.url)URL.revokeObjectURL(file.url)})
}
// 在组件销毁前调用
onBeforeUnmount(() => {cleanupBlobUrls()
})

9,最后在HTML中自由渲染函数即可 


  补充:

  • startWith函数:startsWith()用于确定此字符串是否以指定字符串的字符开头,并根据需要返回truefalse

  • 输入文件通过event.target.files去寻找,为上传文件组成的数组,有type,name,size等属性
  • URL.createObjectURL()接受文件(比如图片和视频),创建URL一个字符串,是一串指向传入文件的URL路径。
  • URL.revokeObjectURL()接受URL路径,释放URL和原本对应文件的链接

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

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

相关文章

Linux安装Cmake (Centos 7.9)

cmake安装 这个虽然已经更新到了4.0.0版本了&#xff0c;但是我们要用3.5版本的&#xff0c;因为这个比较稳定 官方地址&#xff1a;https://github.com/Kitware/CMake/releases/tag/v3.5.0&#xff0c;选择那个cmake-3.5.0-Linux-x86_64.tar.gz下载&#xff0c; 首先解压文…

Centos7,tar包方式部署rabbitmq-3.7.6

1. 环境准备 安装编译工具和依赖包 yum -y install make gcc gcc-c glibc-devel m4 perl openssl openssl-devel ncurses-devel ncurses-devel xz xmlto perl 2. Erlang环境搭建 版本对应&#xff1a;https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…

【MySQL篇】事务管理,事务的特性及深入理解隔离级别

目录 一&#xff0c;什么是事务 二&#xff0c;事务的版本支持 三&#xff0c;事务的提交方式 四&#xff0c;事务常见操作方式 五&#xff0c;隔离级别 1&#xff0c;理解隔离性 2&#xff0c;查看与设置隔离级别 3&#xff0c;读未提交&#xff08;read uncommitted&a…

C++Primer学习(14.1 基本概念)

当运算符作用于类类型的运算对象时&#xff0c;可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。举个例子&#xff0c;因为在Sales_item类中定义了输入、输出和加法运算符&#xff0c;所以可以通过下述形式输出两个Sales_item…

循相似之迹:解锁协同过滤的核心推荐逻辑

目录 一、引言二、协同过滤的基本原理三、协同过滤的算法类型&#xff08;一&#xff09;基于用户的协同过滤&#xff08;二&#xff09;基于物品的协同过滤 四、协同过滤的应用案例&#xff08;一&#xff09;电商平台的商品推荐&#xff08;二&#xff09;音乐平台的歌曲推荐…

RuoYi基础学习

1 若依搭建 前后端分离版本&#xff1a;RuoYi-Vue利用SpringBoot作为后端开发框架&#xff0c;与Vue.js结合&#xff0c;实现了前后端分离的开发模式。这种架构有助于提高开发效率&#xff0c;前后端可以独立开发和部署&#xff0c;更适合现代化的Web应用开发。 RuoYi-Vue3&a…

Docker 安装部署Harbor 私有仓库

Docker 安装部署Harbor 私有仓库 系统环境:redhat x86_64 一、首先部署docker 环境 定制软件源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum install -y yum-utils device-mapper-persistent-data lvm2…

【Basys3】外设-灯和数码管

灯 约束文件 set_property PACKAGE_PIN W5 [get_ports CLK] set_property PACKAGE_PIN U18 [get_ports rst] set_property PACKAGE_PIN U16 [get_ports {led[0]}] set_property PACKAGE_PIN E19 [get_ports {led[1]}] set_property PACKAGE_PIN U19 [get_ports {led[2]}] set…

【Django】教程-1-安装+创建项目+目录结构介绍

欢迎关注我&#xff01;后续会更新django教程。一周2-3更&#xff0c;欢迎跟进&#xff0c;本周会更新第一个Demo的单独一个模块的增删改查【Django】教程-4-一个增删改查的Demo【Django】教程-2-前端-目录结构介绍【Django】教程-3-数据库相关介绍 1.项目创建 1.1 安装 Djan…

蓝桥杯 之 二分

文章目录 习题肖恩的n次根分巧克力2.卡牌 二分是十分重要的一个算法&#xff0c;常常用于求解一定范围内&#xff0c;找到满足条件的边界值的情况主要分为浮点数二分和整数二分二分问题&#xff0c;最主要是写出这个check函数&#xff0c;这个check函数最主要就是使用模拟的方法…

SpringBoot集成腾讯云OCR实现身份证识别

OCR身份证识别 官网地址&#xff1a;https://cloud.tencent.com/document/product/866/33524 身份信息认证&#xff08;二要素核验&#xff09; 官网地址&#xff1a;https://cloud.tencent.com/document/product/1007/33188 代码实现 引入依赖 <dependency><…

2025年3月电子学会c++五级真题

结绳 #include <bits/stdc.h> using namespace std;int n,a[10010];int main() {cin>>n;for(int i 0;i<n;i){cin>>a[i];}sort(a0,an);//将a数组从小到大排序double sum 0;for(int i 0;i<n;i){sum (suma[i])/2;}cout<<(int)sum;return 0; } 最…

Typora使用Gitee作为图床

Typora使用Gitee作为图床 文章目录 Typora使用Gitee作为图床Gitee准备图床仓库下载安装软件安装插件 配置Typora Gitee准备图床仓库 新建一个仓库右上角下拉->设置->安全设置->私人令牌->生成新令牌&#xff0c;注意将令牌保存&#xff08;只会出现一次&#xff0…

QT音乐播放器(1):数据库保存歌曲

实现功能&#xff1a;用数据库保存本地导入和在线搜索的歌曲记录 目录 一. 保存本地添加的歌曲 1. 使用QSettings &#xff08;1&#xff09;在构造函数中&#xff0c;创建对象。 &#xff08;2&#xff09;在导入音乐槽函数中&#xff0c;保存新添加的文件路径&#xff0c…

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…

css属性列举

介绍 CSS word-spacing 属性&#xff0c;用于指定段字之间的空间&#xff0c;例如&#xff1a; p {word-spacing:30px; }word-spacing属性增加或减少字与字之间的空白。 注意&#xff1a; 负值是允许的。 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 属…

python实现股票数据可视化

最近在做一个涉及到股票数据清洗及预测的项目&#xff0c;项目中需要用到可视化股票数据这一功能&#xff0c;这里我与大家分享一下股票数据可视化的一些基本方法。 股票数据获取 在经过多次尝试后&#xff0c;发现了一个

从 JDK 11 到 JDK 17:OpenRewrite 实战 Spring Boot 升级指南

一、为什么选择 OpenRewrite 升级&#xff1f; 在 Spring Boot 项目升级 JDK 的过程中&#xff0c;我们面临两个核心痛点&#xff1a; 语法兼容性问题&#xff08;如废弃的 API、新的关键字&#xff09;依赖版本冲突&#xff08;特别是 Spring Boot 与 JDK 版本的匹配&#x…

交换技术综合实验

一、实验拓扑 二、实验要求 内网IP地址使用172.16.0.0/16分配。 SW1和SW2之间互为备份。 VRRP/STP/VLAN/Eth-trunk均使用。 所有PC通过DHCP获取IP地址。 ISP只能配置IP地址。 所有电脑可以正常访问ISP路由器。 三、实验步骤 基于172.16.0.0/16进行划分 172.16.2.0/24&…