SpringMVC的文件上传和下载

        这个部分主要分成三块,文件上传,文件下载,拦截器;
        文件上传和下载好理解,但是拦截器的主要功能还是说你在进行登录的时候,假如你还没登录,然后就跳主页的话,就会把你给拦截下来;下面开始文件上传的功能描述;
        为了能上传文件,必须将表单里的method设置为POST,并将enctype设置为multipart/form-data;只有在这种情况下,浏览器才会把用户选择的文件二进制数据发送给服务器;
        下面是实例;
<html>
    <body>
        <form action = "upload" enctype = "multipart/form-data" method = "post">
            <table>
                <tr>
                    <td>文件描述:</td>
                    <td><input type = "text" name  = "desctiption"></td>
                </tr>
                <tr>
                    <td>请选择文件:</td>
                    <td><input type = "text" name = "file"></td>
                </tr>
                <tr>
                    <td><input type = "submit" value = "上传"></td>
                </tr>
            </table>
        </form>
    </body>
</html>

   然后我们要来一个Controller控制器来接受处理一下文件;

@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String upload(HttpServletRequest request,
                    @RequestParam("description") String description,
                    @RequestParam("file") MultipartFile file) throws Exception{
        System.out.println(description);
        if(!file.isEmpty()){
            String path = request.getServletContext().getRealPath("/images");
            String filename = file.getOriginalFilename();
            File filepath = new File(path,filename);
            if(!filepath.getParentFile().exists()){
                filepath.getParentFile().mkdirs();
            }
            file.transferTo(new File(path + File.separator + filename));
            return "success";
        }else {
            return "error";
        }
}

          而我们知道在SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作,如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver;springmvc-config.xml;

<bean id = "multipartResolver"
      class = "org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name = "maxUploadSize">
          <value>10485760</value>
      </property>
      <property name = "defaultEncoding">
          <value>UTF-8</value>
      </property>
</bean>

  

需要注意的是,CommonsMultipartResolver必须依赖于Apache CommonsFileUpload的组件,所以需要将Apache的Commons FileUpload的jar包放到项目的类路径下;
    另外还有一种上传文件的方式,就是使用接受上传文件,也就是说我们把二进制文件作为一个POJO模型对象来接收上传的文件;
上传文件的jsp页面跟前面一样;在POJO的模型数据时如下;
public class User implements Serializable{
    private String username;
    private MultipartFile image;
    //省略set/get方法;
}

  下面是控制器的代码;

@RequestMapping(value = "/register")
public String register(HttpServletReqeust request,
                      @ModelAttribute User user,
                      Model model) throws Exception{
        System.out.println(user.getUsername());
    if(!user.getImage().isEmpty()){
        String path = request.getServletContext().getRealPath("/images");
        String filename = user.getImage().getOriginalFilename();
        File filepath = new File(path,filename);
        if(!filepath.getParentFile().exists()){
            filepath.getParentFile().mkdirs();
        }
        user.getImage().transferTo(new File(path + File.separator + filename));
        model.addAttribute("user",user);
        return "userInfo";
    }else {
        return "error";
    }
}

  

<h3>文件下载</h3>
<a href = "download?filename = ${requestScope.user.image.originalFilename}">
    ${requestScope.user.image.originalFilename}</a>

  文件下载;代码如下;

@ReqeustMapping(value = "/download")
public ResponseEntity<byte[]> download(HttpServletRequest request,
                              @RequestParam("filename") String filename,
                              Model mode){
        String path = request.getServletContext().getRealPath("/images");
        File file = new File(path + File.separator + filename);
        HttpHeaders headers = new HttpHeaders();
    String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");
    headers.setContentDispositionFormData("attachment",downloadFileName);
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStaus.CREATED);
}

  Interceptor拦截器也是SpringMVC中相当重要的功能,它的主要作用是拦截用户的请求,并进行相应的处理,比如通过拦截器来进行用户权限验证,或者用来判断用户是否已经登录等;我们需要做的就是先定义一个拦截器,然后通过XML文件配置来把接口设置进去;

public class AuthorizationInterceptor implements HandlerInterceptor{
    private static final String[] IGNORE_URI = {"/loginForm","login"};
    @Override 
    public void afterCompletion(HttpServletRequest,
                        HttpServletResponse response,Object handler,Exception exception) throws Exception{
            System.out.println("AuthorizationInterceptor afterCompletion -- >");
    }
    @Override 
    public void postHandle(HttpServletRequest request,HttpServletResponse response,
                          Object handler,ModelAndView mv) throws Exception{
        System.out.println("AuthorizationInterceptor postHandle -- >");
    }
    @Override
    public boolean preHandle(HttpServletReqeust,request,HttpServletResponse response,Object handler) throws Exception{
        System.out.println("AuthorizationInterceptor proHandle -- >");
        boolean flag = false;
        String servletPath = request.getServletPath();
        for(String s : IGNORE_URI){
            if(servletPath.contains(s)){
                flag = true;
                break;
            }
        }
        if(!flag){
            User user = (User) request.getSession().getAttribute("user");
            if(user == null){
                System.out.println("请求拦截");
                request.setAttribute("message","请先登录");
                request.getRequestDispatcher("loginForm").forward(request,response)
            }else {
                System.out.println("AuthorizationInterceptor放形请求");
                flag = true;
            }
        }
        return flag;
    }
}

  在springmvc-config.xml文件中配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path = "/*"/>
        <bean class = "org.fkit.interceptor.AuthorizationInterceptor"/>
    </mvc:interceptor>
</mvc>

  

原文地址:https://www.cnblogs.com/zxx123/p/8530954.html