Spring Boot 學習(一) 檔案上傳
阿新 • • 發佈:2021-06-30
注意:
跳轉html檔案一定要放在同一個靜態資原始檔夾下,否則會出現各種報錯
檔案上傳:
首先編寫html的form表單提交,對於form表單的上傳記得新增enctype,對於多檔案上傳,需要在input標籤下新增multiple
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>form</h1> <form method="post" action="/world/upload" enctype="multipart/form-data"> 使用者名稱:<input type="text" name="username"><br> 上傳檔案:<input type="file" name="userimg"><br> 多檔案:<input type="file" name="photo" multiple><br> <button type="submit">提交</button> </form> </body> </html>
其次編寫關於檔案上傳的Controller,跳轉頁面使用Get請求,與此同時表單提交的html在form資料夾下,此時需要新增對於路徑,檔案上傳需要用到post請求,值得注意的是獲取檔案屬性是通過註解@RequestPart來實現,
package com.sp.Controller; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.MultipartFile; @Slf4j @Controller public class FromSubmit { @GetMapping("/form") public String form_submit() { return "form/formSubmit"; } @PostMapping("/upload") public String upload(@RequestParam("username") String username, @RequestPart("userimg") MultipartFile userimg, //MultipartFile會自動封裝上傳的檔案 @RequestPart("photo") MultipartFile[] photo) { //多檔案上傳儲存在陣列中 log.info("上傳的資訊:username = {}, userimg = {}, photo = {}", username, userimg.getSize(), photo.length); return "index"; //跳轉到index頁面 } }
之後對html上傳的檔案傳輸到本地的磁碟中儲存
通過transferTo方法,以及檔案流裡的方法獲取檔名,檔案大小等方法
@PostMapping("/upload") public String upload(@RequestParam("username") String username, @RequestPart("userimg") MultipartFile userimg, //MultipartFile會自動封裝上傳的檔案 @RequestPart("photo") MultipartFile[] photos) throws IOException { log.info("上傳的資訊:username = {}, userimg = {}, photo = {}", username, userimg.getSize(), photos.length); if (!userimg.isEmpty()) { //獲取原始的檔名 String originalFilename = userimg.getOriginalFilename(); //儲存檔案到指定的本地目錄 userimg.transferTo(new File("D:\\code\\img\\"+originalFilename)); } if (photos.length > 0) { for (MultipartFile photo:photos) { if(!photo.isEmpty()) { String originalFilename = photo.getOriginalFilename(); //獲取檔案的原始名字 photo.getSize(); //獲取檔案大小 photo.transferTo(new File("D:\\code\\img\\"+originalFilename)); } } } return "index"; }
執行之後在本地就有了圖片資訊
這裡需要注意的幾個點:
1..如果配置了攔截器,那麼如果需要測試的情況,則在對應的請求上新增不攔截的部分,如果是登陸的話可以不加,在登陸也完成攔截情況的處理
2.關於頁面跳轉的問題,如果對應的html頁面在不同的資料夾下,那麼需要將其放在同一靜態資原始檔夾,否則很容易產生報錯
3.關於檔案上傳,springboot預設配置了最大上傳的大小,此時需要更改上傳檔案大小
4.關於多檔案上傳,需要將其儲存在一個數組中@RequestPart("photo") MultipartFile[] photo
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
在springboot中有一個MultipartAutoConfiguration,裡面對應的元件
@EnableConfigurationProperties(MultipartProperties.class)
中預設聲明瞭檔案大小,單張照片最大1MB,最多總請求量最大10MB
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false) public class MultipartProperties { /** * Whether to enable support of multipart uploads. */ private boolean enabled = true; /** * Intermediate location of uploaded files. */ private String location; /** * Max file size. */ private DataSize maxFileSize = DataSize.ofMegabytes(1); /** * Max request size. */ private DataSize maxRequestSize = DataSize.ofMegabytes(10); /** * Threshold after which files are written to disk. */ private DataSize fileSizeThreshold = DataSize.ofBytes(0); /** * Whether to resolve the multipart request lazily at the time of file or parameter * access. */ private boolean resolveLazily = false;View Code