表单(Form)提交数据的格式
1.application/x-www-form-urlencoded 文本数据编码格式
<form>表单不指定enctype属性时,默认的数据传输格式。
窗体数据被编码为名称/值对,这是标准且默认的编码格式。
当action为get时候,客户端把form数据转换成一个字串append到url后面,用?分割。
当action为post时候,浏览器把form数据封装到http body中,然后发送到server。
2.multipart/form-data 二进制数据
multipart表示的意思是单个消息头包含多个消息体的解决方案。
multipart媒体类型对发送非文本的各媒体类型是有用的。一般多用于文件上传。
文件上传的表单的要求
1.请求方式:要求是post
2.传输格式要求是:multipart/form-data
<form action="#" method="post" enctype="multipart/form-data">
3.文件上传表单元素使用<input type=”file” name=”接收的名称” />
<input type="file" name="empphoto"/>
Spring MVC处理文件上传的配置
1.配置文件上传解析器
(1)工作在web3.1版本之前:
没有自身的上传处理,需要使用Apache Common File upload框架。
同时配置Spring MVC 文件上传解析器
(2)Web3.1版本之后
使用针对3.1内置文件上传处理功能的标准解析器:
在Spring MVC Ioc容器配置文件中添加下列代码:
<bean id="multipatResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
2.启用文件上传解析器
在web.xml文件中的Spring MVC配置中添加下列内容:
Spring MVC 原始配置:
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/mvc-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
改为下列代码:
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/mvc-context.xml</param-value>
</init-param>
<multipart-config>
<max-file-size>208488200</max-file-size>
<max-request-size>418018841</max-request-size>
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
细心的人会发现官方文档给出的配置文件中会有<location>这个标签:
这里为什么要省略不写呢?首先先说说这个路径的作用,主要是作为存放上传文件的缓存路径,如果省略的话,系统会使用默认的路径。
但是如果自定义的话,那么要保证这个目录文件是存在的,如果不存在,则会发生错误,导致无法成功上传文件。如果是在自己电脑上的话那么这个路径是很容易确认是否存在,但是如果开发中,将项目直接部署到阿里云之类的服务器的话,这个路径容易被忽略,所以一般建议不写。
这个是官方文档的说法:
确保上一节中提供的位置确实存在。如果没有的话,需要创建这个目录。
3.Spring MVC 控制器接收文件处理
在控制器方法中添加接受文件的参数。
Spring MVC 接收文件的类型:MultipartFile
定义接收文件参数: @RequestParam(required=false) MultipartFile photo
其中:@RequestParam注解中的required参数主要作用是指定是否可以不传此参数,当其为true时,一定要传此参数,不然会报错。
下面是一个小例子:
jsp页面代码如下:
<form action="add.mvc" method="post" enctype="multipart/form-data">
<input type="text" name="name"/>
<input type="file" name="photo"/>
<input type="submit" value="submit"/>
</form>
其中,表单<form>一定要加enctype属性,并将其指定为multipart/form-data
控制器方法对应如下:
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(String name,@RequestParam(required=false) MultipartFile photo){
//将文件转成二进制数组
photo.getBytes();
//获取文件名
photo.getOriginalFilename();
//获取文件类型
photo.getContentType();
//其他逻辑代码...
return "";
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
注意:如果业务对象的Model类的photo类型不是MultipartFile,需要单独接收,也就是表单元素的name不能与Model类的文件属性相同。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
下面是官方给出的一个例子:
(完)使用Spring MVC进行文件上传是不是很简单!