主題:Spring MVC中的檔案上傳
-
- 開發環境
- 更多幹貨
- 頁面
- Spring裡的配置
- 要求
- 總結
- 野路子
開發環境
基于:
IntelliJ IDEA
、
Maven建構工具
、
JDK1.8
、
SpringBoot 2.3.4
、
Spring4.3.28
編寫。
官人如需使用 IDEA 請閱讀教程:IntelliJ IDEA
官人如需使用 Maven 請閱讀教程:Maven 建構工具的下載下傳與安裝
更多幹貨
請參考:《穿越 Java 之 文法基礎篇》 系列文章
請參考:《穿越 Java 之 Web基礎篇 》系列文章
請參考:《穿越 Java 之 開發必備架構篇 》 系列文章
請閱讀:《穿越 Java 之 SpringBoot架構篇》系列文章
請閱讀:《穿越 Java 之 SpringCloud微服務架構篇》 系列文章
頁面
-
form表單需要注意:
method = “post"
encrytype=“multipart/form-data”
form表單的action 屬性指定位置 進行上傳操作。
Spring裡的配置
1.顯示頁面。 頁面在WEB-INF下客戶打不開 需要 controller
- 預設情況下,Spring MVC 的
元件,并沒有配置在Spring容器中(DispatcherServlet就不會使用) 下圖為源碼過程MultipartResolver
- 要想處理檔案上傳的請求,需要自己向容器中注冊 該元件
要求
- bean的名稱必須是
,類型必須是multipartResolver
MultipartResolver
的實作類。
下圖兩個實作類 StandardServletMultipartResolver是标準的Servlet 3.0以後的實作 ,
CommonsMultipartResolver是 Commons fileupload 元件的實作
總結
- 如果DispatcherServlet的某種元件隻有一個時, 它的名字是不行瞎叫的(名字就是接口的首字母小寫)。
- 如果某種元件的個數有多個,名字起不起,以及叫什麼都無所謂,隻要類型比對即可。
- 如果使用 CmmonsMultipartResolver 需要導入依賴:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
- 後續處理器方法上的形參類型可以寫(MultipartFile)。
@PostMapping("/upload")
public String upload(@RequestParam("photo") MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();//原始檔案名
String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); //字尾名
String filename= UUID.randomUUID().toString().replace("-", "") + extension;
//假設上傳到C槽
String realPath = webApplicationContext.getServletContext().getRealPath("/upload");
file.transferTo(new File(realPath,filename));
return "redirect:http://www.baidu.com";
}
野路子
@PostMapping("/upload2")
public String upload2(HttpServletRequest request){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getServletContext());
MultipartHttpServletRequest multipartHttpServletRequest = commonsMultipartResolver.resolveMultipart(request);
MultipartFile photo = multipartHttpServletRequest.getFile("photo");
//後續都一樣。
System.out.println(photo!=null);
return "redirect:http://www.baidu.com";
}