技術概述
技術作用:用在批量上傳多張圖片到服務器。
學習原因:用戶上傳圖片如果每次只允許單張上傳,重復操作給用戶體驗感不好,需要支持批量上傳圖片。
技術難點:保存圖片的路徑、圖片上傳存在大小限制
技術詳述
首先后端用一個MultipartFile數組來接收前端傳來的圖片數組,再調用圖片工具類PictureUrlUtil循環寫入圖片,再將拼接后的路徑寫入數據庫。
for (int i = 0; i < files.length; i++) {
String filePath = PathUtil.poccessPath(PictureUrlUtil.getFilePath(files[i]),userId);
PictureUrlUtil.writePicture(files[i],filePath,clothingPath); //將圖片輸出到clothingPic文件夾
MattingUtil.getImage("/outfits/" +clothingPath+"/"+filePath);
int subtypeId = subtypeIdArray.getInteger(i);
filePath = filePath.replace(".jpg",".png");
wardrobeDao.importPic(filePath, userId, subtypeId);
}
路徑拼接在多處需要復用,而且寫的時候很容易錯,所以寫成一個路徑工具類,用以生成路徑。在Linux系統上路徑全為正斜杠。服務器上需要建三個文件夾用於存放用戶頭像圖片、衣物圖片、博客圖片。
/**
* 將圖片輸出到與項目同一級的文件夾下
* @param file 圖片
* @param fileFolderName 文件夾名稱
*/
public static void writePicture(MultipartFile file,String fileName,String fileFolderName){
try{
FileOutputStream picOutput = new FileOutputStream("/outfits/" + fileFolderName + "/" + fileName); //設置文件路徑
picOutput.write(file.getBytes()); //獲取字節流直接寫入到磁盤內
picOutput.close();
}
catch (Exception e){
}
}
/**
* 獲取圖片本地路徑
* @param multipartFile 圖片名稱
* @return
*/
public static String getFilePath(MultipartFile multipartFile){
String realfilePath = "";
try{
realfilePath += multipartFile.getOriginalFilename();
}
catch (Exception e){}
return realfilePath;
}
由於還實現了摳圖,所以最后插入數據庫的是摳過的圖的路徑。用戶上傳衣物流程如下:
技術難題與解決過程
技術難題在於上傳多張圖片時會失敗。最開始根據報錯在網上找了很多方法都沒有解決,經過多次上傳不同個數、不同類型的圖片,發現規律:只上傳不大於1MB的圖片會成功;如果傳多張圖片,基本只能上傳成功一張。再查資料發現因為springboot默認最大支持上傳1MB以下的文件,需要對框架進行配置。
解決方法為在resources文件夾下的application.properties中添加以下內容:
spring.servlet.multipart.enabled =true
spring.servlet.multipart.file-size-threshold =0
spring.servlet.multipart.maxFileSize=500MB
spring.servlet.multipart.maxRequestSize=500MB
multipart.enabled =true 表示允許文件上傳
multipart.file-size-threshold =0 表示支持文件寫入磁盤
multipart.maxFileSize=500MB 表示最大支持文件大小為500MB
multipart.maxRequestSize=500MB 表示最大支持請求大小
總結
實現起來本身不難,但是會有一些bug和難以注意到細節。手工測試會比較慢,而且覆蓋不全面,借助自動化測試就能提高效率,較快地解決問題。
springboot框架本身通過注釋和一些封裝的方法就能夠簡化代碼,並且集成了ssm,配置簡單。尤其時DAO層的代碼優化后,維護起來方便很多,不然會顯得對數據庫的操作變得臃腫。后期學有余力應該要閱讀springboot源碼,可以在學會使用的基礎上優化框架的性能。