Spring Boot 會(huì)員管理系統(tǒng)之處理文件上傳功能
溫馨提示
Spring Boot會(huì)員管理系統(tǒng)的中,需要涉及到Spring框架,SpringMVC框架,Hibernate框架,thymeleaf模板引擎。所以,可以學(xué)習(xí)下這些知識(shí)。當(dāng)然,直接入門(mén)的話(huà)使用是沒(méi)問(wèn)題,但是,涉及到一些異常和原理的話(huà)可能就有些困難。
1. 前端部分
在前端部分addMember.html是通過(guò)form表單來(lái)提交會(huì)員的信息,其中就包括了圖片上傳功能(這里涉及了文件上傳操作),表單部分代碼如下:
<form th:action="@{/admin/addMember}" method="post" enctype="multipart/form-data" id="addMember">
<div class="file-field input-field">
<div class="btn">
<span>選擇頭像文件</span>
<input id="file" type="file" name="iconPath" multiple="" placeholder="選擇文件" accept="image/*" onchange="changeToop()">
</div>
<div class="file-path-wrapper">
<!--<input class="file-path validate" type="text" placeholder="Upload one or more files">-->
<img id="myimg" src="assets/iconPath/common.jpg" class="img-responsive img-thumbnail" style="width: 20%;height: 20%" />
</div>
<!--頭像文件上傳預(yù)覽-->
<script>
function Id(id){
return document.getElementById(id);
}
function changeToop(){
var file = Id("file");
if(file.value===''){
//設(shè)置默認(rèn)圖片
Id("myimg").src='assets/iconPath/common.jpg';
}else{
preImg("file","myimg");
}
}
//獲取input[file]圖片的url Important
function getFileUrl(fileId) {
var url;
var file = Id(fileId);
var agent = navigator.userAgent;
if (agent.indexOf("MSIE")>=1) {
url = file.value;
} else if(agent.indexOf("Firefox")>0) {
url = window.URL.createObjectURL(file.files.item(0));
} else if(agent.indexOf("Chrome")>0) {
url = window.URL.createObjectURL(file.files.item(0));
}
return url;
}
//讀取圖片后預(yù)覽
function preImg(fileId,imgId) {
var imgPre =Id(imgId);
imgPre.src = getFileUrl(fileId);
}
</script>
</div>
.......
</form>
這里有一個(gè)注意事項(xiàng):因?yàn)樯婕拔募蟼?,所以在form中需要加入enctype="multipart/form-data",而且就是input中的name屬性是與后端中的Controller映射方法的傳入?yún)?shù)名是一一對(duì)應(yīng)的。
2. 后端代碼實(shí)現(xiàn)
后端中對(duì)于SpringMVC框架可以對(duì)于文件進(jìn)行處理然后我們可以通過(guò)傳入?yún)?shù)的方式來(lái)接收文件
2.1 Controller處理傳入文件
代碼如下:
@PostMapping("/addMember")
public String addMember(Member member, String gradeName, MultipartFile icon, Map<String, Object> model) {
//處理上傳文件
try {
if (icon == null)//首先判斷上傳文件不為null
return "error";
if (icon.getOriginalFilename().equals("")) //如果上傳文件的原名為空字符串,則證明使用了默認(rèn)圖像
member.setIconPath("/assets/icon/common.jpg"); //設(shè)置為我們的默認(rèn)圖像路徑
else
//這里通過(guò)了自己編寫(xiě)的文件上傳工具類(lèi)來(lái)處理上傳的MultipartFile,文件名設(shè)置為通過(guò)UUID產(chǎn)生的字符串
member.setIconPath(FileUploadUtil.upload(icon, "/assets/icon/", UUIDRandomUtil.get32UUID()));
} catch (Exception e) {
e.printStackTrace();
return "error";
}
.......
return "addMemberSuccess";
}
2.2 FileUploadUtil工具類(lèi)保存文件
在Controller的MultipartFile文件傳入后需要進(jìn)一步,轉(zhuǎn)變?yōu)镕Ile并且保存到磁盤(pán)當(dāng)中,所以我分開(kāi)處理,把Controller的傳入文件交給FileUploadUtil工具類(lèi)來(lái)處理,具體的代碼如下:
public class FileUploadUtil {
/**
* 上傳文件
* @param multipartFile multipartFile
* @param prefixPath 前綴路徑,相對(duì)于整個(gè)項(xiàng)目中的路徑,路徑最前面不用加入“/”
* @param fileName 上傳后的文件名
* @return 上傳后最終的相對(duì)路徑+文件名
* @throws Exception 有可能空指針異常和IO異常
*/
public static String upload(MultipartFile multipartFile, String prefixPath, String fileName) throws Exception {
//得出上傳的絕對(duì)路徑
String uploadPath = ClassUtils.getDefaultClassLoader().getResource("").getPath() +"/static"+ prefixPath;
File file = new File(uploadPath);
if (!file.exists())
if (file.mkdirs())
System.out.println("成功創(chuàng)建目錄");
//獲取上傳的后綴名
String suffixName = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
//新建最終確定的文件
file = new File(uploadPath+fileName+suffixName);
multipartFile.transferTo(file);
return prefixPath+fileName+suffixName;
}
}
上面中的ClassUtils是Spring提供的一個(gè)工具類(lèi),而調(diào)用方法getDefaultClassLoader().getResource("").getPath()是獲取當(dāng)前項(xiàng)目classpath下的路徑。
以上便是本系統(tǒng)中關(guān)于文件上傳的部分內(nèi)容,該系統(tǒng)的源碼以上傳GitHub和下載源碼
總結(jié)
以上所述是小編給大家介紹的Spring Boot 會(huì)員管理系統(tǒng)之處理文件上傳功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
java 中動(dòng)態(tài)代理詳解及實(shí)例
這篇文章主要介紹了java 中動(dòng)態(tài)代理詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Java InheritableThreadLocal用法詳細(xì)介紹
InheritableThreadLocal繼承了ThreadLocal,此類(lèi)擴(kuò)展了ThreadLocal以提供從父線程到子線程的值的繼承:當(dāng)創(chuàng)建子線程時(shí),子線程接收父線程具有的所有可繼承線程局部變量的初始值。 通常子線程的值與父線程的值是一致的2022-09-09
spring cloud 阿波羅 apollo 本地開(kāi)發(fā)環(huán)境搭建過(guò)程
Apollo(阿波羅)是攜程框架部門(mén)研發(fā)的配置管理平臺(tái),能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性2018-01-01
如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean詳解
這篇文章主要給大家介紹了關(guān)于如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
Spring核心容器之Bean創(chuàng)建過(guò)程詳解
這篇文章主要介紹了Spring核心容器之Bean創(chuàng)建過(guò)程詳解,獲取?Bean?的方法是?getBean,其來(lái)自?BeanFactory?繼承的AbstractAutowireCapableBeanFactory?抽象類(lèi)繼承的AbstractBeanFactory?抽象類(lèi)中,需要的朋友可以參考下2023-11-11
Java中實(shí)現(xiàn)二叉樹(shù)的遍歷與重構(gòu)
這篇文章主要介紹了Java中實(shí)現(xiàn)二叉樹(shù)的遍歷與重構(gòu),樹(shù)是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合,把它叫做樹(shù)是因?yàn)樗雌饋?lái)像一棵倒掛的樹(shù),也就是說(shuō)它是根朝上,而葉朝下的,需要的朋友可以參考下2023-10-10
Mybatis-Plus中IdType.AUTO局部配置不生效的問(wèn)題解決
本文主要介紹了Mybatis-Plus中IdType.AUTO局部配置不生效的問(wèn)題解決,數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí),id的默認(rèn)生成方式還是雪花算法,局部配置沒(méi)有生效,下面就來(lái)解決一下,感興趣的可以了解一下2023-09-09
Java多線程局域網(wǎng)聊天室的實(shí)現(xiàn)
在學(xué)習(xí)了一個(gè)學(xué)期的java以后,搞了一個(gè)多線程的聊天室,熟悉了一下服務(wù)器和客戶(hù)機(jī)的操作。感興趣的小伙伴們可以參考一下2021-06-06
Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互實(shí)例代碼
Axios作為一個(gè)流行的前端?HTTP?通信庫(kù),可以極大地簡(jiǎn)化前端與后端之間的數(shù)據(jù)交互,這篇文章主要介紹了Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09

