SpringBoot多文件上传
多文件上传是在单文件上传的基础上修改而来,不了解单文件上传可以参考上一篇。以下在将修改部分展示如下:
一、修改upload.html文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>多文件上传页面</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="请选择文件" multiple>
<input type="submit" value="上传">
</form>
</body>
</html>
二、修改控制器:
多文件上传的逻辑与单文件类似,只是其基础上接收部分多了文件数组,再遍历一回完成如下:
package org.sang.cc;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;import javax.servlet.http.HttpServletRequest;import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
public class FileUploadController {SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");@PostMapping("/upload")public String upload(MultipartFile[] uploadFile,HttpServletRequest req){try {//String realPath=req.getSession().getServletContext().getRealPath("/");String realPath=ResourceUtils.getURL("classpath:").getPath(); String format=sdf.format(new Date());System.out.println("realPath:"+realPath+"static/"+format);File folder=new File(realPath+"static/"+format);if(!folder.isDirectory()){folder.mkdirs();}String[] filePath=new String[uploadFile.length];String s="";for(int i=0;i<uploadFile.length;i++){String oldName=uploadFile[i].getOriginalFilename();String newName=UUID.randomUUID().toString()+oldName.substring(oldName.lastIndexOf("."),oldName.length());uploadFile[i].transferTo(new File(folder,newName)); filePath[i]=req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+"/static/"+format+"/"+newName; s+=filePath[i]+" <br>";} return s;}catch(IOException e){e.printStackTrace();}return "上传失败!";}
}
三、运行结果:

上传页

接收页

展示页
相关文章:
SpringBoot多文件上传
多文件上传是在单文件上传的基础上修改而来,不了解单文件上传可以参考上一篇。以下在将修改部分展示如下: 一、修改upload.html文件: <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title&g…...
MyBatis-数据库连接池、属性文件config.properties、类名简化、MyBatis的整体架构
一、数据库连接池 1、概述 存储实现创建好的连接对象的容器 2、优点 避免了频繁创建和销毁连接对象 3、使用 在使用到连接对象时可在数据库连接池中直接获取 4、实现 不需要我们去实现,框架和一些第三方有现成的组件(C3P0、ADCP、德鲁伊(阿里巴巴)ÿ…...
Flink-Source的使用
Data Sources 是什么呢?就字面意思其实就可以知道:数据来源。 Flink 做为一款流式计算框架,它可用来做批处理,也可以用来做流处理,这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…...
C0031.在Clion中使用mingw编译器来编译opencv的配置方法
mingw编译器编译opencv库的配置方法...
Android——连接MySQL(Java版)
Android——连接MySQL(Java版) 目录: Android——连接MySQL(Java版)一、JDBC1、什么是JDBC2、载入JDBC3、创建JDBC的工具类 二、使用数据库 一、JDBC 1、什么是JDBC JDBC全称Java Database Connectivity,译为Java语言连接数据库,是sun公司制…...
「四」体验HarmonyOS端云一体化开发模板——工程目录结构与云侧工程一键部署AGC云端
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...
Kotlin:后端开发的新宠
在当今的软件开发领域,编程语言的选择对于项目的成功至关重要。Kotlin,一种由 JetBrains 开发的编程语言,近年来在后端领域逐渐崭露头角,展现出了广阔的应用前景。 一、Kotlin 简介 Kotlin 是一种基于 JVM(Java Virt…...
SSM全家桶 1.Maven
或许总要彻彻底底地绝望一次 才能重新再活一次 —— 24.11.20 maven在如今的idea中已经实现自动配置,不需要我们手动下载 一、Maven的简介和快速入门 Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建测试、打包和发…...
SpringBoot 集成 html2Pdf
一、概述: 1. springboot如何生成pdf,接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节:页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...
利用 Watchtower 自动监听并更新正在运行的 Docker 容器
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 大部分 VPS 和 NAS 用户或多或少都有用 Docker 来部署一些 Self-hosting 的服务,其中大部分项目都是开源项目,更新频率非常高,特别是一些版本 0.x 的项目,及…...
Nodejs开发仿马蜂窝旅游小程序API接口,服务器端开发,商家后台 Vue3+微信小程序+koa+mongodb+node.js
文章目录 🚀 开启您的互联网创业新篇章一、🔥 课程亮点:二、🌐 适合人群:学习这个课程后,您将会收获到三、旅游后台管理系统1.后台登录界面2.后台首页 四、前台旅游小程序1.首页展示2.目的地界面3.搜索功能…...
极限失控的大模型使电力系统面临的跨域攻击风险及应对措施
目录: 0 引言 1 就大模型发生极限失控的风险进行讨论的必要性、紧迫性 1.1 预训练的数据来源 1.2 能力涌现与不可解释性 1.3 大模型与物质世界的连接 1.4 数量效应与失控 1.5 大模型发生极限失控的风险 1.5.1 人工智能反叛所需要素能力的拼图 1.5.2 火种源…...
mybatis-plus方法无效且字段映射失败错误排查
问题: Invalid bound statement (not found): com.htlc.assetswap.mapper.WalletMapper.insert,并且select * 进行查询时带下划线的字段未成功映射。 排查: 1.检查WalletMapper接口,确保继承自BaseMapper 2.启用驼峰命名法映射。a…...
librdns一个开源DNS解析库
原文地址:librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器,用于DNS解析。 源代码地址:GitHub - vstakhov/librdns: Asynchrono…...
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前言 在Unity3D中,逻辑服(Entity, ComponentData和System)是一种非常高效的组件化设计模式,它可以帮助开发者更好地管理游戏中的实体和逻辑。本文将详细介绍Unity3D逻辑服的概念以及如何实现Entity、ComponentData和System的划分。 对惹,这…...
跟《经济学人》学英文:2024年11月23日这期 Why British MPs should vote for assisted dying
Why British MPs should vote for assisted dying A long-awaited liberal reform is in jeopardy in jeopardy:在危险中 jeopardy:美 [ˈdʒepərdi] 危险;危机;风险; 原文: THIS NEWSPAPER believes …...
基于阿里云服务器部署静态的website
目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…...
【2024 Optimal Control 16-745】Ubuntu22.04 安装Julia
找不到Julia 内核 下载Julia curl -fsSL https://install.julialang.org | sh官网下载:Julia 安装 IJulia 打开 Julia REPL(在终端中输入 julia)并执行以下命令安装 IJulia: using Pkg Pkg.add("IJulia")这将为 Ju…...
nuget默认包管理格式:packages.config、packageReference区别
packages.config 和 PackageReference 是 NuGet 中的两种包管理格式,各有优劣,适用于不同的场景。以下是它们的详细对比: 1. packages.config 格式 这是 NuGet 的传统包管理格式,早期版本使用的默认方法。 特点 依赖声明文件&…...
element-plus教程:Input Number 数字输入框
一、基础用法 要使用Input Number数字输入框,只需要在<el-input-number>元素中使用v-model绑定变量即可。例如: <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...
Unity Addressable资源管理系统实战指南
1. 这不是“换个加载方式”,而是重构资源交付链路的起点Unity Addressable系统刚发布那会儿,我正带一个横跨三端(iOS/Android/PC)的AR互动项目。美术团队每天提交200张高清贴图、50个FBX模型,打包后APK体积飙到1.8GB—…...
Selenium WebDriver协议层原理与稳定性实战
1. 这不是“又一个Selenium教程”——它解决的是你写完第一行代码后立刻卡住的问题“Selenium WebDriver教程”这六个字,我过去三年在团队内部文档、外包需求评审、新人入职培训材料里见过至少278次。但几乎每次打开,都只看到“安装ChromeDriver”“启动…...
01-大模型AI:大模型学习指南
大模型概述 一、大模型训练的三大核心阶段 预训练:自监督学习的“知识积累期” 预训练是大模型的“启蒙阶段”,采用自监督学习模式。模型像海绵一样从海量文本数据中自主学习语言规律、语义关联和世界知识。例如,训练一个AI领域大模型时,会输入数百万篇AI论文、技术博客…...
深入Linux内核链表:从of_property_read_bool看设备树属性的组织与查找
深入Linux内核链表:从of_property_read_bool看设备树属性的组织与查找 在Linux内核开发中,设备树(Device Tree)作为描述硬件配置的标准方式,其高效解析机制一直是内核开发者关注的焦点。当我们调用 of_property_read_…...
Unity序列化三要素:Serializable、SerializeField与SerializeReference详解
1. 为什么Unity序列化总让人困惑——从一个真实报错说起 刚接手一个老项目时,我遇到个特别典型的场景:美术同事在Inspector里调好了角色的装备配置,保存后切到另一台机器打开,所有装备栏全空了。Debug发现, List<E…...
告别美术字烦恼!Unity UGUI自定义字体工具一键打包全流程(附避坑指南)
告别美术字烦恼!Unity UGUI自定义字体工具一键打包全流程(附避坑指南)在游戏UI开发中,美术字体往往是提升视觉表现力的关键元素。然而,从设计稿到最终在Unity中完美呈现,这条路上布满了各种"坑"&…...
2026最新免费图片去水印保姆级教程!这5种方法一次学会,第三种零门槛秒出图
你是不是也遇到过这种情况?好不容易在小红书、抖音上刷到一张绝美壁纸,保存下来却被水印破坏了整体美感;想把博主分享的干货截图保存,结果那个半透明的Logo刚好挡在关键数据上。别急,今天这篇教程就是为你准备的。 202…...
OpenCV实战:用Python从零实现Canny边缘检测(含完整代码与调参技巧)
OpenCV实战:用Python从零实现Canny边缘检测(含完整代码与调参技巧)计算机视觉领域中,边缘检测是图像分析的基础步骤之一。1986年由John F. Canny提出的Canny边缘检测算法,至今仍是效果最佳的边缘检测方法之一。本文将带…...
PostgreSQL COPY命令:高效数据导入的最佳实践
引言 在处理大量数据插入场景时,传统的INSERT语句往往会成为性能瓶颈。PostgreSQL提供了COPY命令,能够显著提升数据导入效率。本文将深入探讨COPY命令的工作原理、使用方法以及为什么它比普通INSERT更快。 什么是COPY命令? COPY是PostgreSQL提…...
深度解析2026年高性能RTP导电塑料:十大创新应用与选购指南
在制造业转型升级的关键节点,导电塑料作为高端新材料正面临“性能门槛不断提升”与“供应链稳定性难以兼得”的价值悖论。行业数据显示,2025年高端导电塑料需求增长率达22%,但超过65%的企业在选型过程中因技术参数复杂、供应商服务缺失而导致…...
