前面已經(jīng)使用過SpringMVC的文件上傳鹤耍,SpringBoot中文件上傳和SpringMVC中基本一樣稿黄,只是少了一些依賴導(dǎo)入
一跌造、項(xiàng)目配置
1. 導(dǎo)入依賴
只需要導(dǎo)入文件服務(wù)器轉(zhuǎn)存的依賴:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
2. 配置yml
和之前的springboot項(xiàng)目對(duì)比,只是修改了mybatis的包掃描路徑
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
# 填寫你數(shù)據(jù)庫的url陵珍、登錄名互纯、密碼和數(shù)據(jù)庫名
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
# 配置獲取連接等待超時(shí)的時(shí)間
maxWait: 60000
# 配置間隔多久才進(jìn)行一次檢測(cè)兔院,檢測(cè)需要關(guān)閉的空閑連接站削,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個(gè)連接在池中最小生存的時(shí)間钻哩,單位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打開PSCache,并且指定每個(gè)連接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置監(jiān)控統(tǒng)計(jì)攔截的filters扯键,去掉后監(jiān)控界面sql無法統(tǒng)計(jì)珊肃,'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黑名單 (存在共同時(shí)皿淋,deny優(yōu)先于allow)
deny: 192.168.1.188
# 禁用HTML頁面上的“Reset All”功能
reset-enable: false
# 登錄名
login-username: admin
# 登錄密碼
login-password: 123456
二窝趣、復(fù)制代碼和資源
接下來就是cv工作
1. Java代碼的復(fù)制
SpringMVC中是利用的xml配置文件進(jìn)行MapperScanner的配置哑舒,SpringBoot中不需要了幻馁,但要給Mapper層加上@Mapper注解:
@Mapper
public interface PlayerMapper {
/**
* 新增一個(gè)玩家
* @param player
* @return
*/
Integer addPlayer(Player player);
/**
* 獲取所有玩家
* @return
*/
List<Player> findAllPlayers();
}
2. 資源文件的復(fù)制
SpringBoot中默認(rèn)Mybatis的映射文件存放路徑為resources目錄下的mapper文件夾下仗嗦。
再將registerPlayer.jsp改為registerPlayer.html,使用thymeleaf技術(shù)吏祸,除了刪除jsp中的第一行代碼钩蚊,也沒有改動(dòng):
<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("請(qǐng)選擇文件")
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();
//使用XMLHttpRequest.upload監(jiān)聽上傳過程砰逻,注冊(cè)progress事件泛鸟,打印回調(diào)函數(shù)中的event事件
xhr.upload.addEventListener('progress', function (e) {
//loaded代表上傳了多少
//total代表總數(shù)為多少
var progressRate = (e.loaded / e.total) * 100 + '%';
//通過設(shè)置進(jìn)度條的寬度達(dá)到效果
$('.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;
}
/* 初始狀態(tài)設(shè)置進(jìn)度條寬度為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="注冊(cè)"></p>
</form>
</body>
</html>
3. Controller層新增跳轉(zhuǎn)頁面的處理單元
@RequestMapping("registerPlayer")
public String register() {
return "registerPlayer";
}
效果:
三、同步上傳
之前實(shí)現(xiàn)的功能為文件的異步上傳再芋,即單獨(dú)一個(gè)文件上傳的接口。同步上傳為一次性上傳多個(gè)文件以及請(qǐng)求參數(shù)
1. 修改form表單
<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>
<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="注冊(cè)"></p>
</form>
去除了上傳圖片的按鈕记某,將圖片與form表單一起提交
2. Controller層
使用MultipartFile接收參數(shù):
@RequestMapping("registerPlayer2.do")
@ResponseBody
public String register2(Player player, @RequestParam("photo1") MultipartFile head, @RequestParam("photo2") MultipartFile[] photos) {
...
}