jsp文件上传_SpringMVC【文件上传下载篇】

本文聚焦于SpringMVC相关功能,涵盖文件上传与下载及拦截器。文件上传需特定条件,用Commons - FileUpload组件和MultipartFile对象,SpringMVC封装保存操作;文件下载沿用原方式;拦截器用于Controller预处理和后处理,还介绍了Controller生命周期的三种创建情况。

fbd90392bc219a41d77184cd422cad86.png

1. 摘要

本文主要介绍SpringMVC的文件上传和下载功能、SpringMVC的拦截器。

2. 文件上传

在web开发中一般会有文件上传的操作,比如商城后台管理系统的商品图片上传,比如个人信息录入系统的身份证件图片上传等等。所以很有必要来了解了解文件上传功能。

前台页面上传会使用 Apache组织的Commons-FileUpload组件,后天程序使用SpringMVC的MultipartFile对象接受上传文件,但是必须保证后台参数的名称和表单提交的文件名称一致

2.1. 必要条件

文件上传需要三个必要条件:

[1] 表单请求方式为POST

[2] 使用file文件域上传文件

[3] 表单的enctype属性为"multipart/form-data"

2.2. 导入依赖

需要导入commons-fileupload、commons-io、spring-webmvc依赖。

PS:fileupload组件依赖io组件、webmvc依赖包含了springmvc、spring所需的基本依赖。

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.16.RELEASE</version>
</dependency>

2.3. 准备jsp页面

在webapp/目录下创建fileupload.jsp,主要代码如下:

<fieldset>
	<legend>单个文件上传</legend>
	<form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">
		姓名: <input name="username"><br>
		头像: <input type="file" name="headImg"><br>
		<button type="submit">提交</button>
	</form>
</fieldset>

2.4. 后台代码

首先要清楚,文件上传无非就是使用流将文件读取到了内存中,再通过流输出到电脑磁盘文件上。前台页面使用fileupload插件的作用是通过输入流将文件读取到了内存中,并将文件信息封装到MultipartFile对象里面,换句话说MultipartFile对象里面存储了我们所有想要的信息,如文件名、文件内容类型、文件大小,文件的输入流对象等等。

虽然通过文件输入输出流可以保存文件到磁盘中,但是SpringMVC给文件保存过程操作进行了封装,提供了一个transferTo()方法API给我们直接保存文件到某个目录中。

注意事项:SpringMVC中使用MultipartFile对象接受上传文件,必须保证后台方法MultipartFile 参数的名称和表单提交的文件的名称一致

--需求:将上传文件保存到c:/upload。

@RequestMapping

2.5. 配置文件上传解析器

配置文件上传解析器:bean的名字是固定的

使用spring表达式 #{1024*1024}

<!-- 配置文件上传解析器:bean的名字是固定的,底层使用的名称注入 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 设置上传文件的最大尺寸为1MB -->
	<property name="maxUploadSize" value="#{1 * 1024 * 1024}"></property>
</bean>

2.6. 多文件上传

<fieldset>
	<legend>多个文件上传</legend>
	<form action="${pageContext.request.contextPath}/uploads.do" method="post" enctype="multipart/form-data">
		文件1: <input type="file" name="headImgs"><br>
		文件2: <input type="file" name="headImgs"><br>
		文件3: <input type="file" name="headImgs"><br>
		<button type="submit">提交</button>
	</form>
</fieldset>
@RequestMapping("/uploads")
public String singleUploads(MultipartFile[] headImgs) throws IOException {
		
	//创建一个磁盘目录用于保存文件
	File destFile= new File("c:/upload");
	if(!destFile.exists()) {
		destFile.mkdir();
	}
	for (int i = 0; i < headImgs.length; i++) {
		MultipartFile headImg = headImgs[i];
			
		//使用uuid作为文件随机名称
		String fileName = UUID.randomUUID().toString().replaceAll("-", "");
		//使用FileNameUtils获取上传文件名的后缀
		String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等
		//创建新的文件名称
		String newFileName = fileName + "."+extension;
			
		//创建要保存文件的File对象
		File file = new File(destFile, newFileName);
		//保存文件到本地磁盘
		try {
			headImg.transferTo(file);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	return "redirect:/upload.jsp";
}

3. 文件下载

文件下载,SpringMVC并没有做过多的封装,还是使用原来的下载方式。

JavaWeb 开发中使用ServletOutStream向浏览器响应数据(输出流输出数据),就是下载文件。

--下载文件思路

[1] 接收需要下载文件名称,根据文件名称,找到磁盘对应的文件,读取到内存中形成一个输入流。

[2] 将输入流通过响应对象(HttpServletResponse)响应给浏览器(下载)。

注意:Web一般只会下载小型文件。

@Controller

4. SpringMVC的拦截器

拦截器: Interceptor

Spring MVC的拦截器类似于Servlet 开发中的过滤器Filter,用于对Controller进行预处理和后处理。

--使用SpringMVC拦截器步骤:

1) 定义拦截器类,实现接口org.springframework.web.servlet.HandlerInterceptor。

2) 在springmvc.xml中配置拦截器。

--拦截器方法的执行时机:

1) preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截、登录检查拦截)。

2) postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息)。

3) afterCompletion:视图渲染之后执行(处理Controller异常信息、记录操作日志、清理资源等)。

4.1. 自定义拦截器

public 

4.1.1. 拦截器的配置的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        ">

		<!-- 配置springmvc的注解驱动 -->
		<mvc:annotation-driven/>
			
		<!-- 配置拦截器 :可以有多个拦截器-->
		<mvc:interceptors>
			<!--配置检查登录拦截器  -->
			<mvc:interceptor>
				<!-- 配置拦截的规则
				    只会拦截 控制器请求,不会拦截jsp页面
					/*  只能拦截一级 如 : /list.do /delete.do
						如:/user/list.do , /user/delete.do 二级不能拦截
					/** 可以拦截多级 无论几级都可以 如  /a/b/c/d/list.do
				 -->
				<mvc:mapping path="/**"/>
				
				<!-- 排除拦截的地址,多个地址使用逗号隔开
					/user/login.do
				 -->
				<mvc:exclude-mapping path="/user/login.do"/>
			
				<!-- 拦截器的类型 -->
				<bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/>
			
			</mvc:interceptor>
		</mvc:interceptors>
</beans>

5. SpringMVC 控制器 Controller的生命周期

Spring 容器创建的对象默认都是单例对象。

SpringMVC对象 Controller的对象的创建有三种情况。

Request : 在用户的一次请求中生效(用户每次请求都会创建Controller对象)多例。

Session : Controller对象在一次会话中创建一个对象。

如果控制器中有成员变量设置或者赋值操作,必须使用 request 返回。

2f143a5c591ee2c756b9fb52bc8b7c54.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值