天天看點

穿越Java - 開發架構篇 第三章 Spring Mvc | 第10節Spring Mvc 中的檔案上傳

主題: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 的

    MultipartResolver

    元件,并沒有配置在Spring容器中(DispatcherServlet就不會使用) 下圖為源碼過程
    穿越Java - 開發架構篇 第三章 Spring Mvc | 第10節Spring Mvc 中的檔案上傳
    穿越Java - 開發架構篇 第三章 Spring Mvc | 第10節Spring Mvc 中的檔案上傳
    穿越Java - 開發架構篇 第三章 Spring Mvc | 第10節Spring Mvc 中的檔案上傳
  • 要想處理檔案上傳的請求,需要自己向容器中注冊 該元件
穿越Java - 開發架構篇 第三章 Spring Mvc | 第10節Spring Mvc 中的檔案上傳

要求

  • bean的名稱必須是

    multipartResolver

    ,類型必須是

    MultipartResolver

    的實作類。

    下圖兩個實作類 StandardServletMultipartResolver是标準的Servlet 3.0以後的實作 ,

    CommonsMultipartResolver是 Commons fileupload 元件的實作

    穿越Java - 開發架構篇 第三章 Spring Mvc | 第10節Spring Mvc 中的檔案上傳

總結

  • 如果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";
    }
           

繼續閱讀