江帥帥:精通 Spring Boot 系列 06

奈學教育發表於2020-06-17

Spring Boot 檔案的上傳下載

說真的,在 Spring Boot 實現檔案下載,真的是方便到讓我顫抖。Java 中實現檔案上傳可以用兩個元件:CommonMultipartResolver 和 StandardServletMultipartResolver。

Spring Boot 在 web 模組中整合了 Spring MVC ,檔案上傳這塊兒的支援是可以透過即插即用的 MultipartResolver 實現類:CommonMultipartResolver。如果用它,則需要使用 commons-fileupload 元件來處理。

Spring Boot 提供的檔案上傳自動化配置類是 MultipartAutoConfiguration 中預設使用了 StandardServletMultipartResolver,在上傳檔案甚至能夠做到零配置。

1. 單檔案上傳

1)新增 fileUpload.html 檔案

在上傳頁面的表單中,新增一個 type 為 file 的控制元件,用來選擇需要上傳的圖片檔案。上傳的介面是“/upload”,另外 method 要設定為“post”,還有 enctype 要設定為“multipart/form-data”,程式碼具體如下:

    
    upload

2)新增 FileUploadController 檔案

首先,設定我們的檔案上傳路徑為專案執行目錄下的 upload 資料夾。然後,我們用 MultipartFile 來繫結上傳的檔案,使用 transferTo() 方法可以非常方便實現檔案儲存到磁碟當中。具體實現程式碼如下:

()
{
    String path = req.getSession().getServletContext().getRealPath();
    File folder =  File(path);
     (!folder.isDirectory()) {
        folder.mkdirs();
    }
    String oName = uploadFile.getOriginalFilename();
    String nName = UUID.randomUUID().toString() + oName.substring(oName.lastIndexOf(), oName.length());
     {
        uploadFile.transferTo( File(folder + File.separator + nName));
        String filePath = req.getScheme() +  + req.getServerName() +  + req.getServerPort() +  + nName;
         ;
    }  (IOException ex) {
        ex.printStackTrace();
    }
     ;
}

位址列中,輸入 選擇檔案上傳,具體執行效果如下:

江帥帥:精通 Spring Boot 系列 06

江帥帥:精通 Spring Boot 系列 06

2. 採用物件方式來上傳檔案

很多時候的上傳操作,也都會把檔案作為物件的屬性進行儲存,具體如何實現?下面透過註冊頁面,填寫使用者的相關資訊,然後點選註冊來上傳 User 物件。

1)新增 fileUpload2.html 檔案

透過一個表單,來收集使用者的具體資訊,然後點選“註冊使用者”按鈕即可提交 /register 註冊請求。程式碼具體如下:

    
        使用者名稱:
        密碼:
        頭像:

2)新增 User 類

User 類主要是用來封裝使用者資訊的,其中 MultipartFile 型別的 pic 是用來接收上傳的影像檔案。

 {
     String username;
     String password;
     MultipartFile pic;
    
}

3)新增 userRegister() 方法

在 userRegister() 方法形參列表中,使用 @ModelAttribute 註解將表單提交的資料繫結到 User 物件中,其中圖片會儲存到 User 的 pic 屬性中,然後轉換為 Multipart 型別。檔案上傳成功之後,所有的使用者資訊都儲存到 model 當中。

 {
    ()
    {
         (!user.getPic().isEmpty()) {
            String picPath = req.getServletContext().getRealPath();
            String picName = user.getPic().getOriginalFilename();
            File filePath =  File(picPath, picName);
             (!filePath.getParentFile().exists()){
                filePath.getParentFile().mkdirs();
            }
            user.getPic().transferTo( File(picPath + File.separator + picName));
            model.addAttribute(, user);
             ;
        }  {
             ;
        }
    }
}

3)在 templates 目錄中,新增 userMsg.html 檔案

    
        
            
            使用者名稱

執行效果,具體如下:

江帥帥:精通 Spring Boot 系列 06

3. 多檔案上傳

1)新增 fileUpload2.html 頁面

    選第一張圖片:
    選第二張圖片:
    選第三張圖片:

2)新增 uploadFiles() 方法

()
{
    String path = req.getSession().getServletContext().getRealPath();
    File folder =  File(path);
     (!folder.isDirectory()) {
        folder.mkdirs();
    }
     ( != uploadFiles && uploadFiles.length > ) {
         (MultipartFile uploadFile : uploadFiles) {
            String oName = uploadFile.getOriginalFilename();
            String nName = UUID.randomUUID().toString() + oName.substring(oName.lastIndexOf(), oName.length());
             {
                uploadFile.transferTo( File(folder, nName));
                 ;
            }  (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
     ;
}

執行結果,具體如下:

江帥帥:精通 Spring Boot 系列 06

4. 檔案下載

1)編輯 userMsg.html 頁面

    
        
        使用者名稱
        下載頭像

2)新增 downloadPic() 方法

這裡使用了 ResponseEntity 型別,就能定義返回的 HttpHeaders、BodyBuilder 和 HttpStatus,然後返回客戶端下載。

(value=)
 ResponseEntity<[]> downloadPic(HttpServletRequest request, () String filename, () String userAgent, Model model) Exception{
    String path = request.getServletContext().getRealPath(
        );
    File file =  File(path + File.separator + filename);
    BodyBuilder builder = ResponseEntity.ok();
    builder.contentLength(file.length());
    
    builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
    
    filename = URLEncoder.encode(filename, );
     (userAgent.indexOf() > ) {
        
        builder.header(,  + filename);
    }  {
        
        builder.header(,  + filename);
    }
     builder.body(FileUtils.readFileToByteArray(file));
}

執行效果,具體如下:

江帥帥:精通 Spring Boot 系列 06

免費領取更多技術資料及影片

本文來源於:奈學開發者社群-江帥帥


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2699052/,如需轉載,請註明出處,否則將追究法律責任。

相關文章