SpringMVC處理multipart請(qǐng)求的示例代碼
一、簡(jiǎn)述
multipart格式的數(shù)據(jù)會(huì)將一個(gè)表單拆分為多個(gè)部分(part),每個(gè)部分對(duì)應(yīng)一個(gè)輸入域。在一般的表單輸入域中,它所對(duì)應(yīng)的部分中會(huì)放置文本型數(shù)據(jù),但是如果上傳文件的話(huà),它所對(duì)應(yīng)的部分可以是二進(jìn)制。類(lèi)似這樣:

二、 配置 multipart 解析器
盡管multipart請(qǐng)求看起來(lái)很復(fù)雜,但在Spring MVC中處理它們卻很容易。在編寫(xiě)控制器方法處理文件上傳之前,我們必須要配置一個(gè)multipart解析器,通過(guò)它來(lái)告訴DispatcherServlet該如何讀取multipart請(qǐng)求。
Spring 內(nèi)置了兩個(gè)MultipartResolver的實(shí)現(xiàn):
- CommonsMultipartResolver :使用Jakarta Commons FileUpload解析multipart請(qǐng)求;
- StandardServletMultipartResolver :依賴(lài)于Servlet 3.0對(duì)multipart請(qǐng)求的支持(始于Spring 3.1)。
StandardServletMultipartResolver的配置:
1、聲明Bean:
在applicationContext.xml 配置
在配置類(lèi)中配置
@Bean(name = "multipartResolver")
public StandardServletMultipartResolver getStandardServletMultipartResolver(){
return new StandardServletMultipartResolver();
}
tips:multipart解析器的命名一定要是 multipartResolver ,否則會(huì)報(bào)錯(cuò)。
2、配置上傳參數(shù):
* web.xml 配置
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!--上傳到/tmp/upload 目錄-->
<location>/tmp/upload</location>
<!--文件大小為2M-->
<max-file-size>2097152</max-file-size>
<!--整個(gè)請(qǐng)求不超過(guò)4M-->
<max-request-size>4194304</max-request-size>
<!--所有文件都要寫(xiě)入磁盤(pán)-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
* 配置類(lèi)中配置
繼承 AbstractAnnotationConfigDispatcherServletInitializer 的配置類(lèi)
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
//上傳到/tmp/upload 目錄,文件大小為2M,整個(gè)請(qǐng)求不超過(guò)4M,而且所有文件都要寫(xiě)入磁盤(pán)
registration.setMultipartConfig(new MultipartConfigElement("E:\\upload_ftp",2097152,4194304,0));
}
CommonsMultipartResolver的配置:
1、聲明Bean 和 配置上傳參數(shù)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--設(shè)置上傳目錄/tmp/upload;最大的文件容量設(shè)置為2M;最大的內(nèi)存大小設(shè)置為0,表示所有文件都會(huì)寫(xiě)入磁盤(pán)中;無(wú)法設(shè)定multipart請(qǐng)求整體的最大容量-->
<property name="uploadTempDir" value="/tmp/upload"/>
<property name="maxUploadSize" value="2097152"/>
<property name="maxInMemorySize" value="0"/>
</bean>
區(qū)別:
1、 CommonsMultipartResolver 相比較 StandardServletMultipartResolver 來(lái)說(shuō) 就是無(wú)法設(shè)定multipart請(qǐng)求整體的最大容量。
2、 CommonsMultipartResolver 不會(huì)強(qiáng)制要求設(shè)置臨時(shí)文件路徑。默認(rèn)情況下,這個(gè)路徑就是 Servlet 容器的臨時(shí)目錄。 StandardServletMultipartResolver 必須設(shè)置臨時(shí)文件路徑才能正常執(zhí)行。(以上所述上傳目錄均為臨時(shí)文件路徑)
三、SpringMVC 處理請(qǐng)求
1、前端Form 表單
<form action="/picture" method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<input type="submit">
</form>
tips:需要設(shè)置 enctype="multipart/form-data",以告訴SpringMVC 這是一個(gè)Multipart 請(qǐng)求。
2、后端MVC接受請(qǐng)求
@RequestMapping(value = "/picture",method = RequestMethod.POST)
public String getHome(@RequestPart("picture") MultipartFile picture) throws IOException {
String name = picture.getName();
byte[] bytes = picture.getBytes();
picture.transferTo(new File("/"+picture.getOriginalFilename()));
//這里保存到文件系統(tǒng)的時(shí)候要用相對(duì)路徑,比如這里配置的是 /。以配置的上傳目錄為基準(zhǔn)。即文件路徑 E:/upload_ftp/ 是保存的目錄
return "home";
}
tips:1、@RequestPart("picture") : 當(dāng)注冊(cè)表單提交的時(shí)候,p icture 屬性將會(huì)給定一個(gè) byte 數(shù)組,這個(gè)數(shù)組中包含了請(qǐng)求中對(duì)應(yīng) part 的數(shù)據(jù)(通過(guò) @RequestPart 指定)。如果用戶(hù)提交表單的時(shí)候沒(méi)有選擇文件,那么這個(gè)數(shù)組會(huì)是空(而不是 null )。所以說(shuō)我們甚至可以用byte[]數(shù)組接收Multipart請(qǐng)求而不用 MultipartFile。
2、MultipartFile :用MultipartFile方法接收為我們提供了很多的方法以便進(jìn)行接下來(lái)的工作...
3、 以 Part的形式接受上傳的文件
就主體來(lái)言, Part 接口與 MultipartFile 并沒(méi)有太大的差別。 在很多情況下, Part 方法的名稱(chēng)與 MultipartFile 方法的名稱(chēng)是完全相同的。有一些比較類(lèi)似,但是稍有差異,比如 getSubmittedFileName() 對(duì)應(yīng)于 getOriginalFilename() 。類(lèi)似地, write() 對(duì)應(yīng)于 transferTo() ,借助該方法我們能夠?qū)⑸蟼鞯奈募?xiě)入文件系統(tǒng)中。
值得一提的是,如果在編寫(xiě)控制器方法的時(shí)候,通過(guò)Part參數(shù)的形式接受文件上傳,那么就沒(méi)有必要設(shè)置MultipartResolver 了。只有使用MultipartFile的時(shí)候,我們才需要MultipartResolver。
@RequestMapping(value = "/picture",method = RequestMethod.POST)
public String getHome(@RequestPart("picture") Part picture) throws IOException {
picture.write("/"+picture.getSubmittedFileName());
return "home";
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+thymeleaf國(guó)際化之LocaleResolver接口的示例
本篇文章主要介紹了springboot+thymeleaf國(guó)際化之LocaleResolver的示例 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解
這篇文章主要為大家介紹了SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
java 使用BigDecimal進(jìn)行貨幣金額計(jì)算的操作
這篇文章主要介紹了java 使用BigDecimal進(jìn)行貨幣金額計(jì)算的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
如何在IDEA中對(duì) hashCode()和 equals() 利用快捷鍵快速進(jìn)行方法重寫(xiě)
這篇文章主要介紹了如何在IDEA中對(duì) hashCode()和 equals() 利用快捷鍵快速進(jìn)行方法重寫(xiě),需要的朋友可以參考下2020-08-08
Java使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)
這篇文章主要為大家詳細(xì)介紹了Java如何使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06
SpringBoot3整合Druid的兼容性問(wèn)題解決方案
Druid對(duì)于SpringBoot3的支持不夠全面和友好;存在一些兼容性的問(wèn)題,導(dǎo)致項(xiàng)目報(bào)錯(cuò),所以本文小編給大家介紹了如何解決SpringBoot3整合Druid的兼容性問(wèn)題,需要的朋友可以參考下2023-09-09
關(guān)于JDBC的簡(jiǎn)單封裝(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇關(guān)于JDBC的簡(jiǎn)單封裝(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
升級(jí)springboot3之自動(dòng)配置導(dǎo)入失效問(wèn)題及解決
這篇文章主要介紹了升級(jí)springboot3之自動(dòng)配置導(dǎo)入失效問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Mybatis的Mapper代理對(duì)象生成及調(diào)用過(guò)程示例詳解
這篇文章主要為大家介紹了Mybatis的Mapper代理對(duì)象生成及調(diào)用過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java實(shí)戰(zhàn)員工績(jī)效管理系統(tǒng)的實(shí)現(xiàn)流程
只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+HTML實(shí)現(xiàn)一個(gè)員工績(jī)效管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-01-01

