在项目开发过程中,文件上传是极为常见的功能需求。对于熟悉 Spring MVC 文件上传操作的开发者而言,Spring Boot 中的文件上传与之原理基本相通,只是在依赖管理和配置方式上更为简化。接下来,将详细阐述 Spring Boot 项目中文件上传功能的具体实现步骤。
别再让才华被埋没,别再让项目蒙尘!点击
GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉,立即加入这场席卷全球开发者的星光革命!若你有快速提升github Star github 加星数的需求,访问taimili.com还可解锁更多专属服务。现在转发邀请好友组队,在艾米莉平台解锁神秘流量加成,让我们携手点亮开源世界的璀璨星空,实现GitHub star项目涨星的无限可能!
一、项目配置
1. 导入依赖
在 Spring Boot 项目里,若需将文件转存至文件服务器,仅需导入jersey-client依赖,借助它可便捷地与文件服务器进行交互。具体依赖配置如下:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
2. 配置yml文件
yml文件主要用于配置项目的数据源、MyBatis 等相关信息。相较于常规的 Spring Boot 项目,此处着重修改 MyBatis 的包扫描路径,以此确保 MyBatis 能够精准扫描到数据访问层的接口。同时,采用阿里巴巴的 Druid 连接池来管理数据库连接,其详细配置如下:
mybatis:
type-aliases-package: com.aruba.download.bean
spring:
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.8.109
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.188
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456
上述配置中:
- mybatis.type-aliases-package用于指定 MyBatis 的实体类扫描包。
- spring.datasource相关配置负责设置数据库连接信息以及 Druid 连接池的参数,涵盖连接池的初始大小、最大连接数、连接超时时间等内容,同时还对 Druid 的监控和安全相关设置进行了配置。
二、复制代码和资源
完成项目配置后,接下来需要对相关代码和资源进行迁移与调整。
1. Java 代码的复制
在 Spring MVC 中,通常借助 XML 配置文件来配置MapperScanner,实现对数据访问层接口的扫描。而在 Spring Boot 项目里,无需 XML 配置,仅需在 Mapper 层接口上添加@Mapper注解,Spring Boot 便能自动扫描并管理这些接口。示例如下:
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface PlayerMapper {
/**
* 新增一个玩家
* @param player 玩家对象
* @return 受影响的行数,成功插入返回1,否则返回0
*/
Integer addPlayer(Player player);
/**
* 获取所有玩家
* @return 包含所有玩家信息的List集合
*/
List<Player> findAllPlayers();
}
2. 资源文件的复制
Spring Boot 默认将 MyBatis 的映射文件存放在resources目录下的mapper文件夹中。同时,将原有的registerPlayer.jsp页面改为registerPlayer.html,并采用 Thymeleaf 技术进行渲染。修改后的页面主要删除了 JSP 的第一行代码,其他功能逻辑基本保持不变,实现了文件上传及显示进度的功能。具体代码如下:
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
<script src="js/jquery-1.10.2.min.js"></script>
<script>
$(function () {
// 为上传按钮绑定点击事件
$("#upload").click(function () {
var imgFile = $("#headImg")[0].files[0];
if (imgFile == undefined) {
alert("请选择文件");
return;
}
console.log(imgFile);
var formdata = new FormData();
formdata.append("img", imgFile);
$.ajax({
type: "post",
data: formdata,
url: "uploadImg.do",
processData: false,
contentType: false,
success: function (ret) {
console.log(ret);
alert(ret.msg);
// 更新页面头像显示
$("#head").attr("src", ret.filepath);
$("#filetypeInput").val(ret.filetype);
$("#photoInput").val(ret.filepath);
},
xhr: function () {
var xhr = new XMLHttpRequest();
// 监听文件上传进度
xhr.upload.addEventListener('progress', function (e) {
var progressRate = (e.loaded / e.total) * 100 + '%';
$('.progress > div').css('width', progressRate );
});
return xhr;
}
});
});
});
</script>
<style>
#head {
width: 200px;
height: 200px;
}
.progress {
width: 200px;
height: 10px;
border: 1px solid #ccc;
border-radius: 10px;
margin: 10px 0px;
overflow: hidden;
}
/* 初始状态设置进度条宽度为0px */
.progress > div {
width: 0px;
height: 100%;
background-color: yellowgreen;
transition: all .3s ease;
}
</style>
</head>
<body>
<form action="registerPlayer.do">
<p>用户名:<input type="text" name="name"></p>
<p>密码:<input type="password" name="password"></p>
<p>昵称:<input type="text" name="nickname"></p>
<p>头像:<input id="headImg" type="file">
<input type="button" id="upload" value="上传文件">
</p>
<div class="progress">
<div></div>
</div>
<p><img id="head" alt="未选择图片"></p>
<input id="filetypeInput" type="hidden" name="filetype">
<input id="photoInput" type="hidden" name="photo">
<p><input type="submit" value="注册"></p>
</form>
</body>
</html>
3. Controller 层新增跳转页面的处理单元
为实现正确跳转到registerPlayer.html页面,需在 Controller 层添加对应的处理方法,通过@RequestMapping注解映射请求路径,并返回页面名称。示例代码如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FileUploadController {
@RequestMapping("registerPlayer")
public String register() {
return "registerPlayer";
}
}
三、同步上传
前面实现的是文件的异步上传,即通过单独的接口处理文件上传操作。而同步上传是指在提交表单时,一次性上传多个文件以及其他请求参数。
1. 修改 form 表单
将表单的action属性修改为registerPlayer2.do,并设置enctype="multipart/form-data",以支持文件上传。同时,添加多个文件输入框,并去除上传按钮,使文件与其他表单数据一同提交。修改后的表单代码如下:
<form action="registerPlayer2.do" method="post" enctype="multipart/form-data">
<p>用户名:<input type="text" name="name"></p>
<p>密码:<input type="password" name="password"></p>
<p>昵称:<input type="text" name="nickname"></p>
<p>头像:
<input id="headImg" name="photo1" type="file">
<input id="headImg2" name="photo2" type="file" multiple>
</p>
<div class="progress">
<div></div>
</div>
<p><img id="head" alt="未选择图片"></p>
<input id="filetypeInput" type="hidden" name="filetype">
<input id="photoInput" type="hidden" name="photo">
<p><input type="submit" value="注册"></p>
</form>
2. Controller 层处理
在 Controller 层的处理方法中,使用MultipartFile类型来接收上传的文件。@RequestParam注解用于指定接收的参数名称,对于多个文件,可使用MultipartFile[]数组来接收。示例代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class FileUploadController {
@RequestMapping("registerPlayer2.do")
@ResponseBody
public String register2(Player player,
@RequestParam("photo1") MultipartFile head,
@RequestParam("photo2") MultipartFile[] photos) {
// 处理文件上传逻辑,例如保存文件到指定位置、更新数据库等
// 此处省略具体实现代码
return "文件上传成功";
}
}
通过以上步骤,便完成了 Spring Boot 项目中文件上传功能的实现,涵盖异步上传和同步上传两种方式。在实际项目中,可依据具体需求对代码进行进一步优化与扩展,如添加文件格式校验、文件大小限制等功能 。
如果你还希望添加更多内容,比如详细的代码解释、案例拓展,或者对现有内容的格式、表述进行调整,欢迎随时告诉我。