SpringMVC文件上传
来源:互联网 发布:数据站点应当互不相同 编辑:程序博客网 时间:2024/05/18 22:11
1.1 文件上传
文件上传要求表单满足三个条件:
l 提交方式为:POST
l 添加一个属性enctype,其值为multipart/form-data
l 至少具有一个file表单元素
文件上传一般都要使用apache提供的文件上传工具类,所以我们要导入两个Jar包:
l 文件上传核心Jar包
l 文件上传所依赖的IO Jar包
(1) 环境搭建
A、 导入JAR包
Spring MVC 基础jar包
Apache文件上传的jar包
com.springsource.org.apache.commons.fileupload-1.2.0.jar
com.springsource.org.apache.commons.io-1.4.0.jar
B、 文件上传表单(JSP页面)
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<formaction="${pageContext.request.contextPath }/some/upload.do"
method="POST"enctype="multipart/form-data">
照片:<inputtype="file"name="photo"/><br>
<inputtype="submit"value="上传"/>
</form>
</body>
</html>
要求表单请求必须是“POST”,enctype =”multipart/form-data”,需要提供一个 type=”file”的标签。
C、 编写处理器
package com.abc.handlers;
import java.io.File;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
// 定义处理器
@Controller
@RequestMapping("/some")
public class SomeHandler {
@RequestMapping("/upload.do")
public String doUpload(MultipartFilephoto, HttpSession session) throws Exception {
if (!photo.isEmpty()) {
// String path = "E:/images";
String path = session.getServletContext().getRealPath("/images");
// 获取客户端上传文件的原始文件名
String fileName = System.currentTimeMillis() + photo.getOriginalFilename();
if (fileName.endsWith(".jpg") || fileName.endsWith(".png")) {
File file = new File(path, fileName);
photo.transferTo(file);
return "/WEB-INF/jsp/welcome.jsp";
}
}
return "/message.jsp";
}
}
接收参数:MultipartFile photo 这个参数的回传,需要提供一个MultiPart解析器。
通过transferTo来实现文件的上传。
photo.transferTo(file);
(2) 定义文件上传处理器
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 注册组件扫描器 -->
<context:component-scanbase-package="com.abc.handlers"/>
<!-- 注册MVC注解驱动 -->
<mvc:annotation-driven/>
<!-- 注册Multipart请求解析器 -->
<beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<propertyname="defaultEncoding"value="UTF-8"/>
<propertyname="maxUploadSize"value="#{1024 * 1024 *2}"/> <!-- SPEL -->
</bean>
</beans>
注意:<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
Id=” multipartResolver” id 值必须是这个参数,在源码中可知。
(3) 源码分析
解释为什么id值必须为“multipartResolver”?
初始化方法
doDispatch
(4) 文件上传出现的问题
没有上传文件,但是提交了请求
if(!photo.isEmpty()){
}
当不提交文件时,该photo参数并不为空,既对象不为空。MultpartFile 提供了一个方法isEmpty(),来判断是否为空
上传文件同名问题:
使用一个随机数追加到文件名前面。
String fileName =System.currentTimeMillis() + photo.getOriginalFilename();
上传文件名中文乱码问题:
两种解决方式:
在Springmvc.xml 文件中配置:
<!-- 注册Multipart请求解析器 -->
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding"value="UTF-8"/>
<propertyname="maxUploadSize" value="#{1024 * 1024 *2}"/> <!-- SPEL -->
</bean>
配置中文乱码过滤器:
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
一般两种方式都配置。
(5) 限制文件上传大小
<!-- 注册Multipart请求解析器 -->
<beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<propertyname="defaultEncoding"value="UTF-8"/>
<property name="maxUploadSize" value="#{1024 * 1024 *2}"/> <!-- SPEL -->
</bean>
(6) 上传多个文件
Jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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 }/some/upload.do"
method="POST" enctype="multipart/form-data">
照片1:<input type="file" name="photos"/><br>
照片2:<input type="file" name="photos"/><br>
照片3:<input type="file" name="photos"/><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>
处理器方法
package com.abc.handlers;
import java.io.File;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
// 定义处理器
@Controller
@RequestMapping("/some")
public class SomeHandler {
@RequestMapping("/upload.do")
// SpringMVC使用低版本时,需要使用@RequestParam对数组参数进行校正
// public String doUpload(@RequestParam MultipartFile[] photos, HttpSession session) throws Exception {
public String doUpload(MultipartFile[] photos, HttpSession session) throws Exception {
boolean flag = false;
for (int i = 0; i < photos.length; i++) {
if (!photos[i].isEmpty()) {
// String path = "E:/images";
String path = session.getServletContext().getRealPath("/images");
// 获取客户端上传文件的原始文件名
String fileName = System.currentTimeMillis() + photos[i].getOriginalFilename();
if (fileName.endsWith(".jpg") || fileName.endsWith(".png")) {
File file = new File(path, fileName);
photos[i].transferTo(file);
flag = true;
}
}
}
if(flag) {
return "/WEB-INF/jsp/welcome.jsp";
}
return "/message.jsp";
}
}
- springMVC(11) springMVC文件上传
- SpringMVC-----8、SpringMVC上传文件
- springmvc文件上传总结
- SpringMVC multipart文件上传
- SpringMVC中的文件上传
- springmvc的文件上传
- springMVC上传文件
- springMVC 文件上传
- SpringMVC - 文件上传篇
- springMVC文件上传
- springMVC文件上传
- springMVC文件上传
- SpringMVC 上传文件
- SpringMVC文件上传
- springMVC上传文件
- springMVC上传文件例子
- springMVC上传文件
- springmvc文件上传错误
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing
- 使用wait和notify来实现生产者和消费者
- Java的隐秘之JavaCC
- 使用Lock和Condition实现生产者和消费者
- HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析
- SpringMVC文件上传
- 随笔之框架原理
- Linux前台、后台、挂起、退出、查看命令汇总
- CSS知识点整理
- 练习一(第二周)
- memmove函数与memcpy函数的模拟实现
- 13. Roman to Integer
- 实验7 寻址方式在结构化数据访问总的应用
- win10系统安装教程