Spring Boot 會(huì)員管理系統(tǒng)之處理文件上傳功能
溫馨提示
Spring Boot會(huì)員管理系統(tǒng)的中,需要涉及到Spring框架,SpringMVC框架,Hibernate框架,thymeleaf模板引擎。所以,可以學(xué)習(xí)下這些知識(shí)。當(dāng)然,直接入門(mén)的話使用是沒(méi)問(wèn)題,但是,涉及到一些異常和原理的話可能就有些困難。
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 swing實(shí)現(xiàn)qq登錄界面示例分享
這篇文章主要介紹了使用java swing實(shí)現(xiàn)qq登錄界面示例,需要的朋友可以參考下2014-04-04
Java實(shí)體類(lèi)中Set按照對(duì)象的某個(gè)字段對(duì)set排序
這篇文章主要介紹了Java實(shí)體類(lèi)中Set按照對(duì)象的某個(gè)字段對(duì)set排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問(wèn)題 Hanoi
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問(wèn)題 Hanoi,本文直接給出實(shí)現(xiàn)代碼,代碼中包含大量注釋,需要的朋友可以參考下2015-06-06
Java中內(nèi)部類(lèi)的概念與分類(lèi)詳解
一個(gè)類(lèi)的定義放在另一個(gè)類(lèi)的內(nèi)部,這個(gè)類(lèi)就叫做內(nèi)部類(lèi),下面這篇文章主要給大家介紹了關(guān)于Java中內(nèi)部類(lèi)的概念與分類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:三角數(shù)字
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:三角數(shù)字,本文直接給出實(shí)現(xiàn)代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06
Java for-each循環(huán)使用難題2例(高級(jí)使用方法)
從Java5起,在Java中有了for-each循環(huán),可以用來(lái)循環(huán)遍歷collection和array。For each循環(huán)允許你在無(wú)需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時(shí)無(wú)需調(diào)用while循環(huán)中的hasNext()方法就能遍歷collection2014-04-04

