《Spring實戰》讀書筆記--SpringMVC處理Multipart數據
1.Multipart介紹
1.1 Multipart形式的數據
Multipart格式數據會將一個表單拆分為多個部分(part),每個部分對應一個輸入域。在一般的表單輸入域中,它對應的部分會放置文本型數據,如果是文件上傳形式,它對應的部分可以是二進制。
1.2 Multipart/form-data請求方式
Multipart/form-data是建立在HTTP的POST請求方式以上的請求,其一般用於HTTP文件上傳。
所以我們需要在表單(form)元素中如下設置,使得該表單請求用於處理文件:
1 <form class="" action="" method="post" enctype="multipart/form-data">
2.SpringMVC處理Multipart數據
2.1 配置Multipart解析器
DispatcherServlet沒有實現解析multipart請求數據的功能。它將任務委托給Spring中MutipartResolver策略接口實現,通過這個實現類來解析multipart請求中的內容。Spring3.1后內置兩個MultipartResolver的實現供我們選擇:
- CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart請求。
- StandardServletMultipartResolver: 依賴於Servlet3.0對multipart請求的支持。
一.使用CommonsMultipartResolver解析器
因為CommonsMultipartResolver依賴於Apache Commons FileUpload,所以我們需要引入commons-fileupload
1 <dependency> 2 <groupId>commons-fileupload</groupId> 3 <artifactId>commons-fileupload</artifactId> 4 <version>1.3.1</version> 5 </dependency>
在SpringMVC配置文件中裝載Bean即可,通過注入相關屬性設置參數。
1 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 2 <property name="defaultEncoding" value="utf-8" /> 3 <property name="maxUploadSize" value="1024000" /> 4 <property name="maxInMemorySize" value="204800" /> 5 <property name="uploadTempDir" value="/" /> 6 </bean>
相關屬性說明
| 屬性名 | 說明 |
|---|---|
| defaultEncoding | 默認的解析編碼,默認為iso-8859-1 |
| maxUploaadSize | 上傳文件的最大大小,默認為-1(無限制) |
| maxInMemorySize | 內存緩沖區大小,超過時寫入硬盤,默認為-1(無限制) |
| uploadTempDir | 臨時文件目錄,默認是serlvet容器的臨時目錄 |
二.使用StandardServletMultipartResolver解析器
在SpringMVC配置文件中裝載Bean
1 <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
因為StandardServletMultipartResolver解析使用Servlet的處理Multipart方法處理,所以我們需要在web.xml中設置DispatcherServlet時設置相關屬性
1 <servlet> 2 <servlet-name>useSpringMVC-dispatcher</servlet-name> 3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 4 <init-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>classpath:spring/spring-*.xml</param-value> 7 </init-param> 8 <load-on-startup>1</load-on-startup> 9 <multipart-config> 10 <location>/</location> 11 <max-file-size>102400</max-file-size> 12 <max-request-size>204800</max-request-size> 13 </multipart-config> 14 </servlet>
相關屬性說明
| 屬性名 | 說明 |
|---|---|
| location | 上傳文件所存放的臨時目錄。必須指定 |
| max-file-size | 文件的最大大小,單位為字節。默認沒有限制 |
| max-request-size | 請求的最大大小,單位為字節。默認沒有限制) |
| file-size-threshold | 文件大小閾值,當大於這個閾值時將寫入到磁盤,否則在內存中。默認值為0 |
2.2 處理multipart請求
一.Spring提供了MutilpartFile接口處理Mutilpart數據。接口API如下:
1 public interface MultipartFile { 2 /** 3 * 返回表單中mutilpart數據的名字 4 */ 5 String getName(); 6 /** 7 * 返回該文件名 8 */ 9 String getOriginalFilename(); 10 11 12 boolean isEmpty(); 13 14 15 byte[] getBytes() throws IOException; 16 17 InputStream getInputStream() throws IOException; 18 /** 19 * 把MultipartFile接口對象轉換為File對象 20 */ 21 void transferTo(File dest) throws IOException, IllegalStateException; 22 }
二.控制器處理multipart請求
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html lang="zh-cn"> 5 <head> 6 <meta charset="UTF-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 9 <link rel="stylesheet" 10 href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"> 11 <title>File Upload</title> 12 </head> 13 <body> 14 <div class="container"> 15 <div style="padding-top: 200px"></div> 16 <div class="row"> 17 <div class="col-md-4"></div> 18 <div class="col-md-5"> 19 <div class="panel panel-default" > 20 <div class="panel-heading text-center"> 21 <h2>文件上傳</h2> 22 </div> 23 <div class="panel-body"> 24 <form class="form-horizontal" role="form" action="/springMVC/upload" method="post" enctype="multipart/form-data"> 25 <div class="form-group"> 26 <label class="col-sm-3 text-center">文 件</label> 27 <div class="col-sm-7"> 28 <input type="file" id="exampleInputFile" name="file"> 29 </div> 30 <div class="col-sm-2"></div> 31 </div> 32 <div class="form-group"> 33 <div class="col-sm-12" style="padding-top:10px"> 34 <button type="submit" class="btn btn-primary col-sm-12">上 傳</button> 35 </div> 36 </div> 37 </form> 38 </div> 39 </div> 40 </div> 41 <div class="col-md-3"></div> 42 </div> 43 </div> 44 <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> 45 <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script> 46 </body> 47 </html>
controller代碼
1 @RequestMapping(value="/upload", method=RequestMethod.POST) 2 public String fileUpload(@RequestPart(value="file") MultipartFile multipartFile){ 3 //處理邏輯 4 String path = "E:/java/fileupload/" + file.getOriginalFilename(); 5 multipartFile.transferTo(new File(path)); 6 }
三.多文件上傳
多文件上傳只需要把html代碼中的< input name=".." >name屬性設置為一樣的就好。然后在controller中使用MultipartFile數組接受就行。
1 @RequestMapping(value="/upload", method=RequestMethod.POST) 2 public String fileUpload(@RequestPart(value="file") MultipartFile[] multipartFiles){ 3 //處理邏輯 4 }
