SpringBoot+Vue实现简单的文件上传(策略模式)
SpringBoot+Vue实现简单的文件上传
1 环境 SpringBoot 3.2.1,Vue 2,ElementUI
2 问题 前两篇文章,我们上传了txt、Excel文件,其实文件类型有很多种,如果我们的upload组件没有上传文件类型的限制,那么同一个接口会上传多种文件,而类型不一样,其处理的方式也不一样。一种方式是写if判断,我们判断其类型,然后做特定的处理,那样代码会有大量if判断;另外一个可以使用策略模式来处理,简单来说就是定义一个接口,多个实现类,不同的文件类型使用不同的实现类。这里对策略模式不做详细的介绍,有兴趣的可以自行上网查阅。直接上代码。
接口
public interface FileService {Result upload(MultipartFile file);
}
关于txt文件的处理类
@Service("txt")
public class TextServiceImpl implements FileService {@Overridepublic Result upload(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return Result.builder().code(500).msg("上传失败!").build();}try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {String line;while ((line = reader.readLine()) != null) {// 在这里处理读取到的每一行内容System.out.println(line);}} catch (IOException e) {e.printStackTrace();}return Result.builder().code(200).msg("上传成功").build();}
}
关于xls文件的处理
@Service("xls")
public class XLSServiceImpl implements FileService {@Overridepublic Result upload(MultipartFile file) {if (file.isEmpty()) {return Result.builder().code(500).msg("上传失败!").build();}try (Workbook workbook = new HSSFWorkbook(file.getInputStream())) {//获取第一个sheet页Sheet sheet = workbook.getSheetAt(0);//遍历每行for (Row row : sheet) {//遍历每个单元格for (Cell cell : row) {System.out.print(cell.getStringCellValue() + " ");}System.out.println();}} catch (IOException e) {e.printStackTrace();}return Result.builder().code(200).msg("上传成功").build();}
}
关于xlsx文件的处理
@Service("xlsx")
public class XLSXServiceImpl implements FileService {@Overridepublic Result upload(MultipartFile file) {if (file.isEmpty()) {return Result.builder().code(500).msg("上传失败!").build();}try (Workbook workbook = new XSSFWorkbook(file.getInputStream())) {//获取第一个sheet页Sheet sheet = workbook.getSheetAt(0);//遍历每行for (Row row : sheet) {//遍历每个单元格for (Cell cell : row) {System.out.print(cell.getStringCellValue() + " ");}System.out.println();}} catch (IOException e) {e.printStackTrace();}return Result.builder().code(200).msg("上传成功").build();}
}
入口
@RestController
public class FileController {//处理实现类的集合,spring中,对于同一类bean不同的别名是可以注入到一个map中或者list中的//key为实现类的别名,value就是bean@Autowiredprivate Map<String, FileService> fileServiceMap;@RequestMapping("/fileUpload")private Result fileUpload(@RequestParam("file") MultipartFile file) throws IOException {if (file.isEmpty()) {return Result.builder().code(500).msg("上传失败!").build();}String fileName = file.getOriginalFilename();//这里我们获取到后缀名,然后就可以在map中找到对应的实现类FileService fileService = fileServiceMap.get(getSuffix(fileName));if(fileService == null){return Result.builder().code(500).msg("没有合适的处理器处理上传的文件!").build();}fileService.upload(file);return Result.builder().code(200).msg("上传成功").build();}//获取文件的后缀名private static String getSuffix(String filePath) {int dotIndex = filePath.lastIndexOf('.');if (dotIndex > 0 && dotIndex < filePath.length() - 1) {return filePath.substring(dotIndex + 1);}return "";}
}
附:
1 @Service(“txt”)就是给实现类bean取个别名,然后方便我们后续通过文件的后缀名找到对应的实现类。
2 HSSF 和 XSSF 主要有以下区别:
HSSF 是用于操作 Excel 2003 及以前版本(.xls 文件)的类库。它基于二进制格式。
XSSF 则是用于操作 Excel 2007 及以后版本(.xlsx 文件)的类库,这些版本采用的是 Open XML 格式。XSSF 能够处理更大、更复杂的工作簿,并且在处理一些新特性和功能上更具优势。
相关文章:
SpringBoot+Vue实现简单的文件上传(策略模式)
SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI 2 问题 前两篇文章,我们上传了txt、Excel文件,其实文件类型有很多种,如果我们的upload组件没有上传文件类型的限制,那么同一个…...
软考中级科目包含哪些?应该考哪个?
软考中级包含5个专业方向,分别是:计算机软件、计算机网络、计算机应用技术、信息系统、信息服务。这5个方向又对应15个软考中级科目。 信息系统包括:系统集成项目管理工程师、信息系统监理师、信息安全工程师、数据库系统工程师、信息系统管…...
ArcGIS Enterprise 命令行组件创建配置
1. 创建ArcGIS Server站点 使用 createsite工具 命令行直接执行 createsite.sh [-u <arg>] [-p <arg>] [-d <arg>] [-c <arg>]执行文件 createsite.sh [-f <FILE>]安装目录下会有类似的创建站点文件: 修改其中的内容,…...
Web组成架构
网站源码:分脚本类型,分应用方向操作系统:windows,linux中间件(搭建平台):apche、IIS、tomcat、nginx等数据库:mssql、oracle、sybase、db2、access等 WEB相关安全漏洞 WEB源码类对…...
「Pytorch」roLabelImg 图像异常旋转 bug
在进行Yolo-obb 模型训练的时候需要标注旋转框,roLabelImg 是比较推荐的一款旋转框标注工具,既可以标注正常的矩形框,还可以标注旋转框 roLabelImg Github 地址:https://github.com/HumanSignal/labelImg 但是在使用过程中遇到了…...
java.sql.SQLException: Unknown system variable ‘query_cache_size‘【Pyspark】
1、问题描述 学习SparkSql中,将spark中dataframe数据结构保存为jdbc的格式并提交到本地的mysql中,相关代码见文章末尾。 运行代码时报出相关配置文件错误,如下。 根据该报错,发现网络上多数解决方都是基于java开发的解决方案&a…...
汽车连接器革新!中国星坤产品在汽车安全与效率中的卓越表现!
随着汽车行业的快速发展,车载电子系统的复杂性不断增加,对连接器的性能要求也越来越高。中国星坤推出的汽车连接器,以其卓越的设计和性能,为汽车行业带来了一场技术革新。这些连接器不仅能够适应极端的工作环境,还确保…...
DHCP服务、FTP服务
一、DHCP 1.1 DHCP是什么 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种网络协议,用于自动分配 IP 地址和其他网络配置信息给网络中的设备 1.2 DHCP的好处 自动化: 减少了手动配置 IP 地址和网络参数的工…...
AWS云计算实战:电商平台发卡机器人开发指南
在当今数字化时代,电商平台的自动化运营变得尤为重要。本文将深入探讨如何利用AWS云计算平台开发一款高效的发卡机器人,旨在提高电商平台的自动化水平和用户体验。 关键词 AWS云计算, 电商平台, 发卡机器人 1. 引言 随着电商行业的蓬勃发展ÿ…...
虚拟机及其Debian(kali)安装
本机电脑为Windows10系统专业版,在此基础上安装VMware和系统(Kali) 步骤如下 一、安装 VMware Workstation Pro v16.2.4 安装步骤可参照网上博客,该步骤较简单,此处不做讲解。文件中共计两个,其中一个是激活…...
Linux部署禅道(无脑复制版)
目录 环境部署1、下载,解压2、启动3、设置开机自启 登录禅道登录数据库1、设置账号2、网页登录数据库 环境 Linux系统 Centos7 《Linux一键安装包安装禅道》视频链接: https://www.zentao.net/zentao-install/zentao-linux-install-80523.html 部署 …...
C# .net6使用Hangfire
首先我们先来了解什么是Hangfire? Hangfire 是一个用于 .NET 的任务调度库,允许你在后台运行任务,而不需要依赖外部的任务队列服务或复杂的基础设施。它简化了后台任务的创建、调度和管理过程,使得在 .NET 应用程序中处理长期运行…...
NaiveUI与ElementUI 比较分析
前言 在前端开发的广阔领域中,Vue.js作为最流行的前端框架之一,为开发者提供了丰富的组件库,其中NaiveUI和ElementUI是两个备受瞩目的选择。本文将深入分析这两个组件库的特点、优劣势以及适用场景,帮助开发者在项目中做出更合适…...
使用ChatGPT来撰写和润色学术论文的教程(含最新升级开桶ChatGpt4教程)
现在有了ChatGPT4o更加方便了, 但次数太少了 想要增加次数可以考虑升级开桶ChatGpt4 一、引言 在学术研究中,撰写高质量的论文是一项重要的技能。本教程将介绍如何利用ChatGPT来辅助完成从论文构思到润色的全过程。 二、使用ChatGPT写论文 1. 写标题 Title/T…...
matine组件库踩坑日记 --- react
Mantine实践 一 禁忌核心css样式二 添加轮播图扩展组件 一 禁忌核心css样式 import React from react import ReactDOM from react-dom/client import { BrowserRouter } from react-router-dom; import App from ./App.jsx import ./index.css import mantine/core/styles.cs…...
爬虫学习前记----Python
引言 1.语言:python 2.学习资源:【Python爬虫】 3.爬虫日记: python内容 1.字符串输出 (1)引号问题 print("python") 输出:pythonprint(python) 输出:pythonprint(python"学习") 输出&…...
详解Go语言中的Goroutine组(Group)在项目中的使用
背景(Why) Go语言通过其内置的goroutine和通道(channel)机制,提供了强大的并发支持。goroutine的开销非常低,一个goroutine仅占用几KB的内存,可以轻松创建成千上万个goroutine来处理并发任务。然而,随着并…...
Linux桌面环境手动编译安装librime、librime-lua以及ibus-rime,提升中文输入法体验
Linux上的输入法有很多,大体都使用了Fcitx或者iBus作为输入法的引擎。相当于有了一个很不错的“地基”,你可以在这个“地基”上盖上自己的“小别墅”。而rime输入法,就是一个“毛坯别墅”,你可以在rime的基础上,再装修…...
一文入门【NestJs】Providers
Nest学习系列 ✈️一文入门【NestJS】 ✈️一文入门【NestJs】Controllers 控制器 🚩 前言 在NestJS的世界里,理解“Providers”是构建健壮、可维护的后端服务的关键。NestJS,作为Node.js的一个现代框架,采用了Angular的一些核…...
云原生(Cloud native)
云原生(Cloud native) 一 定义 目前比较权威的定义主要来自Pivotal公司和云原生计算基金会(Cloud Native Computing Foundation,简称CNCF)。 1.1 Pivotal 4个要点: DevOps、持续交付、微服务、容器化。六…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
