網(wǎng)站首頁 編程語言 正文
文章目錄
- 一、 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)類StandardMultipartFile是StandardMultipartHttpServletRequest的靜態(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
相關推薦
- 2022-07-31 Windows使用cmd命令行查看、修改、刪除與添加環(huán)境變量_DOS/BAT
- 2022-12-21 Python?eval()和exec()函數(shù)使用詳解_python
- 2022-10-27 Python使用pandas將表格數(shù)據(jù)進行處理_python
- 2022-09-25 C++ sort比較函數(shù)的寫法,最全面的總結
- 2023-02-02 C++調用matlab引擎實現(xiàn)三維圖的繪制_C 語言
- 2022-07-23 C#文件路徑Path類介紹_C#教程
- 2022-09-05 淺析Servlet三大容器的常用方法及其作用域
- 2022-12-03 Python學習之列表和元組的使用詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支