上傳是web程序中常見的功能,當使用上傳時,需要把form表單中的enctype屬性改為multipart/form-data,這樣就使用了二進制進行上傳,而后台需要解析這些數據。DispatcherServlet並不能解析它,而需要委托給Spring中的MultipartResolver接口實現去解析。在Spring3.1之后,Spring內置了兩種MultipartResolver的實現:
- CommonsMultipartResolver:使用了Jakarta Commons FileUpload來解析
- StandardServletMultipartResolver:基於Serlvet3.0對multipart的支持
本隨筆將對二者就行舉例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data"> <input name="txt" type="text" placeholder="文本信息"><br> <input name="file" type="file"><br> <input type="submit"> </form> </body> </html>
Controller代碼:
package cn.powerfully.demo.web.controller; import java.io.IOException; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping("user") public class UserController { @RequestMapping(path = "upload", method = RequestMethod.GET) public String uploadUI(Model model) { return "upload"; } @RequestMapping(path = "upload", method = RequestMethod.POST) public String upload(Model model, String txt, MultipartFile file) throws IllegalStateException, IOException { if (file == null) { model.addAttribute("msg", "上傳失敗!"); } else { String msg = String.format("文本信息:%s<br>文件名:%s<br>文件大小:%d字節<br>", txt, file.getOriginalFilename(), file.getSize());
//... model.addAttribute("msg", msg); } return "msg"; } }
一、StandardServletMultipartResolver
首先需要創建StandardServletMultipartResolver對象,可以在springMVC配置文件中添加如下代碼,注意一定要加上id(按id裝配)
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />
對於上傳的參數,不是在bean中配置的,而是在web.xml中的DispatcherServlet配置的:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <multipart-config> <location>/</location> <max-file-size>102400</max-file-size> <max-request-size>204800</max-request-size> </multipart-config> </servlet>
使用multipart-config節點進行配置,在multipart-config中,有四個子節點:
location | 上傳文件所存放的臨時目錄。必須指定 |
max-file-size | 文件的最大大小,單位為字節。默認沒有限制 |
max-request-size | 請求的最大大小,單位為字節。默認沒有限制 |
file-size-threshold | 文件大小閾值,當大於這個閾值時將寫入到磁盤,否則在內存中。默認值為0 |
二、CommonsMultipartResolver
因為基於Jakarta Commons FileUpload,所以要先引入commons-fileupload
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
接着只需要在springMVC的配置文件中裝載Bean即可
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
要配置參數,只要對bean注入參數:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8" /> <property name="maxUploadSize" value="1024000" /> <property name="maxInMemorySize" value="204800" /> <property name="uploadTempDir" value="/" /> </bean>
defaultEncoding | 默認的解析編碼,默認為iso-8859-1 |
maxUploaadSize | 上傳文件的最大大小,默認為-1(無限制) |
maxInMemorySize | 內存緩沖區大小,超過時寫入硬盤,默認為-1(無限制) |
uploadTempDir | 臨時文件目錄,默認是serlvet容器的臨時目錄 |
除了以上參數,還有其他的......