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

學(xué)無先后,達(dá)者為師

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

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

作者:她丶如月中來 更新時(shí)間: 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實(shí)現(xiàn)文件上傳功能
    • 一.使用MultipartFile實(shí)現(xiàn)文件上傳。
    • 二.使用MultipartHttpServletRequest實(shí)現(xiàn)文件上傳(推薦)。

一、 SpringMVC文件上傳

SpringMVC對(duì)文件上傳提供了良好的支持,在Springboot中僅需提供簡(jiǎn)單的配置則可以完成文件上傳功能。在SpringMVC中,DispatcherServlet會(huì)通過適配器模式將HttpServletRequest轉(zhuǎn)為MultipartHttpServletRequest對(duì)象。MultipartHttpServletRequest接口擴(kuò)展了HttpServletRequest接口和MultipartRequest接口的所有方法,并且自定義了一些操作文件的方法,從而通過這些方法實(shí)現(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的大致關(guān)系如圖:
在這里插入圖片描述


二、SpringBoot配置文件上傳

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

#是否起開SpringMVC上傳功能
spring.servlet.multipart.enabled=true
#指定默認(rèn)上傳的文件夾
spring.servlet.multipart.location=
#指定默認(rèn)上傳單個(gè)文件大小(默認(rèn)是1MB)
spring.servlet.multipart.max-file-size=1MB
#指定所有文件總共大小(默認(rèn)是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

這個(gè)異常通常是因?yàn)殛P(guān)閉了SpringMVC文件上傳功能造成的,將springboot配置改為:spring.servlet.multipart.enabled=true(開啟文件上傳功能)即可。

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

這個(gè)錯(cuò)誤是最常見的,因?yàn)镾pringMVC文件上傳默認(rèn)單個(gè)文件上傳大小為1MB,也就是1048576 bytes,此時(shí)應(yīng)該就是你上傳的文件超過了1MB,只需要將SpringMVC支持單個(gè)文件上傳大小調(diào)大即可。spring.servlet.multipart.max-file-size=?MB。

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

這個(gè)錯(cuò)誤在于單次請(qǐng)求文件上傳文件總大小超過SpirngMVC文件上傳總大小,這個(gè)總大小默認(rèn)是10MB,可以通過spring.servlet.multipart.max-request-size=?MB修改。


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

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

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

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

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

    @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();
        //獲取上傳文件輸入流,便于文件內(nèi)容讀寫操作
        InputStream inputStream = multipartFile.getInputStream();
        System.out.println("fileName = " + fileName + ", contentType = " + contentType);
    }

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


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

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

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

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

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

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


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

欄目分類
最近更新