SapringMVC的文件上传下载以及拦截器

1.      文件上传

一般JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件

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

文件上传必须条件

  1. 表单必须post
  2. 表单必须有 file 文件域
  3. 表单的 enctype="multipart/form-data"

 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>

后台代码

	@RequestMapping("/upload")
	public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throws IOException {
		
		System.out.println(headImg.getName());//获取上传文件的表单名称 
		System.out.println(headImg.getContentType());//MIME类型
		System.out.println(headImg.getSize());//文件大小
		System.out.println(headImg.getOriginalFilename());//获取上传文件的完整名称
		//获取上传文件对应的输入流
		//InputStream in = headImg.getInputStream();
		
		//创建一个磁盘目录用于保存文件
		File destFile= new File("c:/upload");
		if(!destFile.exists()) {
			destFile.mkdir();
		}
		//使用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);
		//保存文件到本地磁盘
		headImg.transferTo(file);
		
		return "redirect:/upload.jsp";
	}

  文件上传解析器的配置

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

 

多文件上传

<fieldset>
		<legend>多
@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";
	}

  

2.      文件下载

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

package cn.zj.springmvc.controller;

 

import java.io.FileInputStream;

import java.io.IOException;

 

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.commons.io.IOUtils;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

@Controller

public class DownloadController {

    /*

     * 下载文件思路

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

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

     *

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

     *

     */

    @RequestMapping("/download")

    public void upload(String fileName ,HttpServletResponse response) throws IOException {

        //0. 判断是否vip,有积分,金豆

        //TODO

       

        //1. 接受文件名,读取磁盘对应的文件,创建输入流对象

       

        FileInputStream inputStream = new FileInputStream("C:/"+fileName);

       

        //2.获取响应对象的输出流

        ServletOutputStream outputStream = response.getOutputStream();

       

       

        //3.文件下载文件名的编码使用ISO-08859-1编码

        //我们需要将我们UTF-8的 filename转换ISO-8859-1编码

        //3.1先将字符串以UTF-8转换成字节数组

        byte[] bytes = fileName.getBytes("UTF-8");

        //3.2再将字节数组以 ISO-8859-1转换字符串

        fileName = new String(bytes, "ISO-8859-1");

       

       

        //4.响应的内容应该是以附件的形式响应给浏览器(设置响应头)

        response.setHeader("Content-Disposition", "attachment;filename="+fileName);

       

        //5.响应文件给浏览器

        IOUtils.copy(inputStream, outputStream);

       

    }

   

}

  

  

3. SpringMVC的拦截器

拦截器 : Interceptor

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

使用SpringMVC拦截器步骤:

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

2)在applicationContext.xml中配置拦截器

拦截器方法的执行时机:

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

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

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

2.1.  自定义拦截器

public class CheckLoginInterceptor implements HandlerInterceptor {

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

    // true : 放行  false :不放行

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

            throws Exception {

       

        System.out.println("拦截器执行了......");

        //从Session中获取登录信息

        String username = (String)request.getSession().getAttribute("username");

        System.out.println(username);

       

        if(username !=null) {

            //放行

            return true;

        }else {

            //跳转到登录页面去

            response.sendRedirect(request.getContextPath()+"/login.jsp");

            return false;

        }

    }

   

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

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

            ModelAndView modelAndView) throws Exception {

    }

   

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

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

            throws Exception {

    }

}

  


2.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>

  

原文地址:https://www.cnblogs.com/w312308542/p/11172635.html