Spring Boot批量上傳圖片


技術概述

    技術作用:用在批量上傳多張圖片到服務器。
    學習原因:用戶上傳圖片如果每次只允許單張上傳,重復操作給用戶體驗感不好,需要支持批量上傳圖片。
    技術難點:保存圖片的路徑、圖片上傳存在大小限制

技術詳述

    首先后端用一個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源碼,可以在學會使用的基礎上優化框架的性能。

參考博客

使用Spring Boot上傳文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM