前言
上一章節,我們講解了利用
模版引擎
實現前端頁面渲染,從而實現動態網頁的功能,同時也提出了兼容jsp
項目的解決方案。既然開始講解web開發了,我們就接着繼續往web
這個方向繼續吧。通常,我們在做web
開發時,碰見諸如附件上傳、圖片頭像上傳等文件的上傳需求也是再正常不過的。那么,我們今天我們就來講講SpringBoot
下文件上傳
的功能的實現。
一點知識
我們知道,前端上傳文件時,最常見的就是利用Form
表單的方式進行文件的上傳功能了,上傳時設置enctype
為multipart/form-data
,或者直接利用jquery
的一些上傳插件實現。而后端,在jsp+Servlet
時代,最常見的就是利用smartupload
上傳組件。而在SpringMvc
時代,其提供了MultipartFile
封裝類,它包含了文件的二進制流和文件相關屬性(文件名、大小等)。所以在SpringBoot
中也是使用此封裝類進行文件上傳的。
文件上傳
上面說到,
springmvc
中是利用MultipartFile
進行文件上傳的。而MultipartFile
是個接口類,它的實現類有CommonsMultipartFile
和StandardMultipartFile
。這里簡單說明下:
StandardMultipartFile:是基於j2ee
自帶的文件上傳進行解析,即使用Servlet3.0
提供的javax.servlet.http.Part
上傳方式。
CommonsMultipartFile:是基於apache fileupload
的解析。
所以正常我們使用時,也是無需關系底層是以哪種方式進行文件上傳處理的,SpringMvc
會給我們做相應的轉換的。
這里演示下兩種方式。
基於J2EE自帶方式
這種方式下,其實無需任何配置。只需按正常的web開發項目集成即可。
0.pom依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.配置文件(可選),正常只需要設置上傳的文件大小
# 最大支持文件大小 即單個文件大小
spring.http.multipart.max-file-size=1Mb
# 最大支持請求大小 即一次性上傳的總文件大小
spring.http.multipart.max-request-size=10Mb
其他的配置,可直接參考官網的配置信息:https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#common-application-properties
2.編寫控制類
FileUploadController.java:
@RestController
@Slf4j
public class FileUploadController {
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IllegalStateException, IOException {
// 判斷是否為空文件
if (file.isEmpty()) {
return "上傳文件不能為空";
}
// 文件類型
String contentType = file.getContentType();
// springmvc處理后的文件名
String fileName = file.getName();
log.info("服務器文件名:" + fileName);
// 原文件名即上傳的文件名
String origFileName = file.getOriginalFilename();
// 文件大小
Long fileSize = file.getSize();
// 保存文件
// 可以使用二進制流直接保存
// 這里直接使用transferTo
file.transferTo(new File("d://okong-" + origFileName));
return String.format(file.getClass().getName() + "方式文件上傳成功!\n文件名:%s,文件類型:%s,文件大小:%s", origFileName, contentType,fileSize);
}
}
3.啟動應用,然后使用postman
進行api調用即可,當然大家也可以利用上節課學習的模版引擎技術,編寫一個文件上傳的表單。
基於FileUpload包方式
原來在
Springmvc
時,我們通常都是使用CommonsMultipartResolver
進行文件上傳處理類配置的,比如最大上傳文件大小的。而基於在SpringBoot
下,略微有些不同。
0.pom加入fileUpload
依賴
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
1.編寫一個配置類
FileUploadConfig.java
@Configuration
public class FileUploadConfig {
@Bean
public MultipartResolver custom() {
return new CommonsMultipartResolver();
}
}
2.由於spring.http.multipart.enabled
默認是true
,所以加載類MultipartAutoConfiguration
會自動加載,這樣fileUpload就會異常了。所以正常有兩種方式:在啟動類下將此配置類不進行自動加載
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
另一種就是,直接設置spring.http.multipart.enabled
為false
。
本示例為了兩種可切換,使用的是第二種。
3.編寫控制層:這個和J2EE
的方式是一樣的,這里就不貼了。
4.啟動應用,使用postman訪問下:
相關資料
總結
本章節主要是講解了兩種方式來進行文件的上傳功能。這里就簡單的介紹了兩種方式的相關配置和一些注意點,像文件大小過大時進行異常捕獲,大家可以使用全局異常類來進行捕獲,只需捕獲
MultipartException
異常即可,這里就示例了,相對來說比較簡單了。
最后
目前互聯網上很多大佬都有
SpringBoot
系列教程,如有雷同,請多多包涵了。本文是作者在電腦前一字一句敲的,每一步都是實踐的。若文中有所錯誤之處,還望提出,謝謝。
老生常談
- 個人QQ:
499452441
- 微信公眾號:
lqdevOps
個人博客:http://blog.lqdev.cn
原文地址:http://blog.lqdev.cn/2018/08/07/springboot/chapter-seventeen/
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-17