日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

SpringMVC文件上傳功能實現(xiàn)

作者:她丶如月中來 更新時間: 2022-07-18 編程語言

文章目錄

  • 一、 SpringMVC文件上傳
  • 二、SpringBoot配置文件上傳
  • 三、SpringBoot配置文件上傳常見異常
    • 1. java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
    • 2. FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.
    • 3. SizeLimitExceededException: the request was rejected because its size (xxxx) exceeds the configured maximum (xxxx)
  • 四、SpringBoot實現(xiàn)文件上傳功能
    • 一.使用MultipartFile實現(xiàn)文件上傳。
    • 二.使用MultipartHttpServletRequest實現(xiàn)文件上傳(推薦)。

一、 SpringMVC文件上傳

SpringMVC對文件上傳提供了良好的支持,在Springboot中僅需提供簡單的配置則可以完成文件上傳功能。在SpringMVC中,DispatcherServlet會通過適配器模式將HttpServletRequest轉為MultipartHttpServletRequest對象。MultipartHttpServletRequest接口擴展了HttpServletRequest接口和MultipartRequest接口的所有方法,并且自定義了一些操作文件的方法,從而通過這些方法實現(xiàn)文件上傳。

public interface MultipartHttpServletRequest extends HttpServletRequest, MultipartRequest {

	/**
	 * Return this request's method as a convenient HttpMethod instance.
	 */
	@Nullable
	HttpMethod getRequestMethod();

	/**
	 * Return this request's headers as a convenient HttpHeaders instance.
	 */
	HttpHeaders getRequestHeaders();

	/**
	 * Return the headers for the specified part of the multipart request.
	 * <p>If the underlying implementation supports access to part headers,
	 * then all headers are returned. Otherwise, e.g. for a file upload, the
	 * returned headers may expose a 'Content-Type' if available.
	 */
	@Nullable
	HttpHeaders getMultipartHeaders(String paramOrFileName);

}

HttpServletReuqest和MultipartHttpServletRequest的大致關系如圖:
在這里插入圖片描述


二、SpringBoot配置文件上傳

在使用SpringMVC上傳文件時,還需要配置MultipartHttpServletRequest,而這個任務是通過MultipartResolver接口實現(xiàn)。在Springboot機制中,如果你沒有配置MultipartResolver對象,那么springboot會自動為你創(chuàng)建一個MultipartResolver對象,這個對象實際為StandardServletMultipartResolver。常用的文件配置項有一下幾條:

#是否起開SpringMVC上傳功能
spring.servlet.multipart.enabled=true
#指定默認上傳的文件夾
spring.servlet.multipart.location=
#指定默認上傳單個文件大小(默認是1MB)
spring.servlet.multipart.max-file-size=1MB
#指定所有文件總共大小(默認是10MB)
spring.servlet.multipart.max-request-size=10MB

三、SpringBoot配置文件上傳常見異常

1. java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided

這個異常通常是因為關閉了SpringMVC文件上傳功能造成的,將springboot配置改為:spring.servlet.multipart.enabled=true(開啟文件上傳功能)即可。

2. FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

這個錯誤是最常見的,因為SpringMVC文件上傳默認單個文件上傳大小為1MB,也就是1048576 bytes,此時應該就是你上傳的文件超過了1MB,只需要將SpringMVC支持單個文件上傳大小調大即可。spring.servlet.multipart.max-file-size=?MB。

3. SizeLimitExceededException: the request was rejected because its size (xxxx) exceeds the configured maximum (xxxx)

這個錯誤在于單次請求文件上傳文件總大小超過SpirngMVC文件上傳總大小,這個總大小默認是10MB,可以通過spring.servlet.multipart.max-request-size=?MB修改。


四、SpringBoot實現(xiàn)文件上傳功能

通過以上的簡單介紹,現(xiàn)在讓我們來實現(xiàn)一個SpringBoot文件上傳功能,首先我配置了SpringMVC單個文件上傳文件大小10MB和單次請求上傳文件總大小100MB,并且開啟SpringMVC文件上傳功能。

spring:
  servlet:
    multipart:
    # 是否開啟springMVC 多部分上傳功能(默認開啟)
      enabled: true
    # 上傳單個文件大小(默認是1MB)
      max-file-size: 10MB
    # 限制所有文件大小
      max-request-size: 100MB

一.使用MultipartFile實現(xiàn)文件上傳。

MultipartFile接口和MultipartHttpServletRequest接口并沒有關系,但是MultipartFile接口的實現(xiàn)類StandardMultipartFileStandardMultipartHttpServletRequest的靜態(tài)內部類,所以可以使用MultipartFile實現(xiàn)文件上傳,具體實現(xiàn)可以查看StandardMultipartHttpServletRequest類源代碼。使用也十分簡單,代碼如下:

    @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public void uploadFile(@RequestParam(value = "file") MultipartFile multipartFile) throws IOException {
        //獲取上傳文件名稱
        String fileName = multipartFile.getOriginalFilename();
        //獲取上傳文件類型
        String contentType = multipartFile.getContentType();
        //獲取上傳文件輸入流,便于文件內容讀寫操作
        InputStream inputStream = multipartFile.getInputStream();
        System.out.println("fileName = " + fileName + ", contentType = " + contentType);
    }

使用@RequestParam將參數(shù)名為file的參數(shù)轉換為一個MultipartFile對象,然后就可以通過getOriginalFilename方法獲取文件名稱,getContentType方法獲取文件類型,getInputStream方法獲取一個輸入流,便可以對文件進行操作。采用PostMan測試:
在這里插入圖片描述
控制臺輸入結果:
在這里插入圖片描述
對于MultipartFile實現(xiàn)文件上傳可以參看StandardMultipartHttpServletRequest源碼,這里不再過多敘述。


二.使用MultipartHttpServletRequest實現(xiàn)文件上傳(推薦)。

在默認情況下,Spring推薦使用StandardMultipartHttpServletRequest,這個類也就是MultipartHttpServletRequest接口的實現(xiàn)類,文件上傳處理流程主要在StandardMultipartHttpServletRequest中實現(xiàn)。StandardMultipartHttpServletRequest可以一次性處理多個文件上傳,而且不用像MultipartFile那樣需要指定參數(shù)名稱。常規(guī)的使用如下:

    @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public void uploadFile(HttpServletRequest request) throws IOException {

        // 強制將HttpServletRequest轉為MultipartHttpServletRequest
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        //獲取指定MultipartFile文件
        MultipartFile file = multipartRequest.getFile("java");
        //獲取文件名稱
        String originalFilename = file.getOriginalFilename();
        //保存上傳文件到xxx路徑
        file.transferTo(Paths.get("xxx"));

        //不指定上傳文件參數(shù),而是獲取整個上傳文件集合
        MultiValueMap<String, MultipartFile> multiFileMap = multipartRequest.getMultiFileMap();
        //遍歷整個上傳文件集合,獲取上傳文件
        Iterator<String> MultipartFileIterator = multiFileMap.keySet().iterator();
        while (MultipartFileIterator.hasNext()) {
            String key = MultipartFileIterator.next();
            //這里是集合的原因是,可能一個參數(shù)上傳多個文件。
            List<MultipartFile> multipartFiles = multiFileMap.get(key);
            System.out.println("當前上傳文件參數(shù): " + key);
            multipartFiles.forEach(multipartFile -> {
                System.out.println("上傳文件名稱: " + multipartFile.getOriginalFilename() + ", 上傳文件類型:" + multipartFile.getContentType());
            });
            System.out.println("------------分割----------");
        }
    }

使用PostMan發(fā)送4個文件,其中兩個為java,兩個為docker。控制輸入結果如下:
在這里插入圖片描述
控制臺打印結果:
在這里插入圖片描述
這大概是SpringMVC最常見的兩種上傳文件方式,MultipartHttpServletRequest擁有更多可操作的方法,而且更方便處理多個文件同時上傳。MultipartFile適合單個文件上傳,兩種各有自己的優(yōu)勢,根據(jù)自己的情況選擇即可。


原文鏈接:https://blog.csdn.net/qq_43600166/article/details/125288005

欄目分類
最近更新