SpringMVC第二天

1.文件上传

在web开发中一般会有文件上传的操作

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

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

文件上传必须条件:

1.  表单必须post

2.  表单必须有 file 文件域

 

3.  表单的 enctype="multipart/form-data"

//SpringMVC中使用  MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致
    @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";
    }

2.文件下载

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

ackage 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异常信息,记录操作日志,清理资源等)

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 {
    }
}

 


1.  表单必须post

2.  表单必须有 file 文件域

3.  表单的 enctype="multipart/form-data"

 

posted @ 2019-07-11 21:14  WhisperHong  阅读(195)  评论(0编辑  收藏  举报