Spring MVC 实现文件上传 【Spring MVC 学习笔记 三】

表单(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进行文件上传是不是很简单!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值