文件上传
说明
在Java中,主流的文件上传方式有两种,分别是通用文件上传(commons-fileupload)和Servlet3.0方式的文件上传。SpringMVC分别对着两种方式都做了支持。
- CommonsMultipartResolver
- StandardServletMultipartResolver
除此之外SpringMVC对文件上传的接口做了统一的封装,使用
MultipartFile
接口代替了通用上传中的FileItem
和Servlet3.0中的Part
,使得开发人员在业务代码中可以使用统一的接口处理,而不用管底层用的是哪种文件上传实现方式。
基于Apache Fileupload通用文件上传包
-
添加依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
-
在SpringMVC配置文件中添加MultipartResolver文件上传解析器
<!-- 配置基于apache fileupload的通用文件上传器(注意:id属性不可省略) --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 指定文件上传编码 --> <property name="defaultEncoding" value="UTF-8" /> </bean>
- 在Controller中编写文件上传逻辑代码
"myFile" 对应jsp页面上传文件的组件name
<input type="file" name = "myFile"/>
@RequestMapping("/upload")
public String upload(@RequestParam("myFile") MultipartFile file, HttpServletRequest req, Model model) {
try {
// 使用SpringMVC给我们提供的工具类获取项目中upload文件夹在硬盘上的绝对路径
String uploadPath = WebUtils.getRealPath(req.getServletContext(), "/upload/");
// 将上传的文件写到上传目录
file.transferTo(new File(uploadPath+file.getOriginalFilename()));
} catch (IOException e) {
e.printStackTrace();
}
}
基于Servlet3.0标准API文件上传
-
开启Servlet文件上传支持
web.xml
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 开启Servlet文件上传支持 --> <multipart-config /> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
在SpringMVC中配置MultipartResolver
<!-- 配置基于Servlet3.0文件上传器(注意:id属性不可省略) --> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />
-
在Controller中编写文件上传逻辑代码
实现方式同通用上传代码一样。
文件名上传乱码问题
-
使用通用上传方式的解决方法
在配置的CommonsMultipartResolver bean中注入属性
<!-- 配置基于apache fileupload的通用文件上传器(注意:id属性不可省略) --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 指定文件上传编码 --> <property name="defaultEncoding" value="UTF-8" /> </bean>
-
使用Servlet3.0标准上传方式的解决方法
通过配置SpringMVC提供的编码过滤器解决
web.xml
<filter> <filter-name>characterFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
本质上还是设置请求的编码 request.setCharacterEncoding("UTF-8");