您好,登錄后才能下訂單哦!
一、簡述
multipart格式的數(shù)據(jù)會將一個表單拆分為多個部分(part),每個部分對應一個輸入域。在一般的表單輸入域中,它所對應的部分中會放置文本型數(shù)據(jù),但是如果上傳文件的話,它所對應的部分可以是二進制。類似這樣:
二、 配置 multipart 解析器
盡管multipart請求看起來很復雜,但在Spring MVC中處理它們卻很容易。在編寫控制器方法處理文件上傳之前,我們必須要配置一個multipart解析器,通過它來告訴DispatcherServlet該如何讀取multipart請求。
Spring 內(nèi)置了兩個MultipartResolver的實現(xiàn):
StandardServletMultipartResolver的配置:
1、聲明Bean:
在applicationContext.xml 配置
在配置類中配置
@Bean(name = "multipartResolver") public StandardServletMultipartResolver getStandardServletMultipartResolver(){ return new StandardServletMultipartResolver(); }
tips:multipart解析器的命名一定要是 multipartResolver ,否則會報錯。
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> <!--整個請求不超過4M--> <max-request-size>4194304</max-request-size> <!--所有文件都要寫入磁盤--> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
* 配置類中配置
繼承 AbstractAnnotationConfigDispatcherServletInitializer 的配置類
@Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { //上傳到/tmp/upload 目錄,文件大小為2M,整個請求不超過4M,而且所有文件都要寫入磁盤 registration.setMultipartConfig(new MultipartConfigElement("E:\\upload_ftp",2097152,4194304,0)); }
CommonsMultipartResolver的配置:
1、聲明Bean 和 配置上傳參數(shù)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--設置上傳目錄/tmp/upload;最大的文件容量設置為2M;最大的內(nèi)存大小設置為0,表示所有文件都會寫入磁盤中;無法設定multipart請求整體的最大容量--> <property name="uploadTempDir" value="/tmp/upload"/> <property name="maxUploadSize" value="2097152"/> <property name="maxInMemorySize" value="0"/> </bean>
區(qū)別:
1、 CommonsMultipartResolver 相比較 StandardServletMultipartResolver 來說 就是無法設定multipart請求整體的最大容量。
2、 CommonsMultipartResolver 不會強制要求設置臨時文件路徑。默認情況下,這個路徑就是 Servlet 容器的臨時目錄。 StandardServletMultipartResolver 必須設置臨時文件路徑才能正常執(zhí)行。(以上所述上傳目錄均為臨時文件路徑)
三、SpringMVC 處理請求
1、前端Form 表單
<form action="/picture" method="post" enctype="multipart/form-data"> <input type="file" name="picture"> <input type="submit"> </form>
tips:需要設置 enctype="multipart/form-data",以告訴SpringMVC 這是一個Multipart 請求。
2、后端MVC接受請求
@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)的時候要用相對路徑,比如這里配置的是 /。以配置的上傳目錄為基準。即文件路徑 E:/upload_ftp/ 是保存的目錄 return "home"; }
tips:1、@RequestPart("picture") : 當注冊表單提交的時候,p icture 屬性將會給定一個 byte 數(shù)組,這個數(shù)組中包含了請求中對應 part 的數(shù)據(jù)(通過 @RequestPart 指定)。如果用戶提交表單的時候沒有選擇文件,那么這個數(shù)組會是空(而不是 null )。所以說我們甚至可以用byte[]數(shù)組接收Multipart請求而不用 MultipartFile。
2、MultipartFile :用MultipartFile方法接收為我們提供了很多的方法以便進行接下來的工作...
3、 以 Part的形式接受上傳的文件
就主體來言, Part 接口與 MultipartFile 并沒有太大的差別。 在很多情況下, Part 方法的名稱與 MultipartFile 方法的名稱是完全相同的。有一些比較類似,但是稍有差異,比如 getSubmittedFileName() 對應于 getOriginalFilename() 。類似地, write() 對應于 transferTo() ,借助該方法我們能夠?qū)⑸蟼鞯奈募懭胛募到y(tǒng)中。
值得一提的是,如果在編寫控制器方法的時候,通過Part參數(shù)的形式接受文件上傳,那么就沒有必要設置MultipartResolver 了。只有使用MultipartFile的時候,我們才需要MultipartResolver。
@RequestMapping(value = "/picture",method = RequestMethod.POST) public String getHome(@RequestPart("picture") Part picture) throws IOException { picture.write("/"+picture.getSubmittedFileName()); return "home"; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。