一、前言
隨着互聯網的發展,文件上傳成為了必備的功能之一,而SpringBoot作為目前最流行的開發框架之一,為文件上傳提供了便捷而強大的解決方案。
二、使用multipart/form-data協議進行文件上傳
HTTP協議中支持文件上傳的ContentType為multipart/form-data,SpringBoot通過MultipartFile接口提供了對該協議的支持。
在Controller中使用MultipartFile實現文件上傳:
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
// 處理上傳文件
return "success";
}
這裡的@RequestParam(“file”)指定了上傳文件對應的參數名,SpringBoot會自動將上傳的文件封裝成MultipartFile類型的參數傳遞給Controller方法。
上傳文件的前端代碼:
<input type="file" name="file" />
<input type="submit" value="上傳" />
三、限制上傳文件大小
默認情況下,SpringBoot沒有對上傳文件大小進行限制,但是可以通過配置上傳文件大小來限制用戶上傳文件的大小。
在application.properties或是application.yml文件中添加以下配置:
# 限制上傳文件大小為10MB
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
其中,max-file-size表示單個文件上傳大小,max-request-size表示總上傳大小。若超過限制,則會報FileSizeLimitExceededException異常。
四、保存上傳文件
接收到上傳文件後,一般需要將文件保存到服務器的磁盤或是雲存儲中,SpringBoot通過MultipartFile提供的transferTo方法可以從MultipartFile中獲取文件內容並保存到指定的位置。
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
// 獲取上傳文件名
String fileName = file.getOriginalFilename();
// 拼接保存文件的路徑
String filePath = request.getSession().getServletContext().getRealPath("upload/");
// 如果路徑不存在則創建該路徑
File dest = new File(filePath + fileName);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try {
// 保存文件
file.transferTo(dest);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
該示例中,首先獲取上傳文件的原始名稱,接着通過HttpServletRequest獲取到保存文件的路徑,之後判斷路徑是否存在,若不存在則創建該路徑,最後調用transferTo方法將文件保存到指定位置。
五、處理多文件上傳
在某些情況下,需要一次性上傳多個文件,此時可以使用SpringBoot提供的MultipartHttpServletRequest實現多文件上傳。
@PostMapping("/multiUpload")
public String multiUpload(HttpServletRequest request) {
List files = ((MultipartHttpServletRequest) request).getFiles("file");
for (MultipartFile file : files) {
// 處理上傳文件
}
return "success";
}
該示例中,首先獲取上傳的所有文件通過MultipartHttpServletRequest的getFiles方法獲取到MultipartFile集合,之後遍歷集合處理每一個上傳文件。
六、完成代碼
上傳文件Controller的完整代碼:
@Controller
public class UploadController {
@GetMapping("/upload")
public String upload() {
return "upload";
}
@GetMapping("/multiUpload")
public String multiUpload() {
return "multiUpload";
}
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
// 獲取上傳文件名
String fileName = file.getOriginalFilename();
// 拼接保存文件的路徑
String filePath = request.getSession().getServletContext().getRealPath("upload/");
// 如果路徑不存在則創建該路徑
File dest = new File(filePath + fileName);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try {
// 保存文件
file.transferTo(dest);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
@PostMapping("/multiUpload")
public String multiUpload(HttpServletRequest request) {
List files = ((MultipartHttpServletRequest) request).getFiles("file");
for (MultipartFile file : files) {
// 處理上傳文件
}
return "success";
}
}
上傳文件的HTML代碼:
文件上傳
<input type="file" name="file" />
<input type="submit" value="上傳" />
上傳多文件的HTML代碼:
多文件上傳
<input type="file" name="file" multiple="multiple"/>
<input type="submit" value="上傳" />
原創文章,作者:NTXTJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/372562.html