《Spring實戰》讀書筆記--SpringMVC處理Multipart數據


《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 }

3.References

https://my.oschina.net/cnlw/blog/168466


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM