spring mvc 文件上传怎么过滤文件类型,如exe文件等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc 文件上传怎么过滤文件类型,如exe文件等相关的知识,希望对你有一定的参考价值。

参考技术A 从request中获取文件名,截取最后一个“.”后的String,来判断是否为你想要的。
或者,从前端过滤最好,直接截取文件名,看是不是想要的,不是想要的直接不让上传。

Spring MVC框架 学习笔记总结

文章目录

1. SpringMVC的 拦截器

1.1 拦截器和过滤器


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

过滤器是交给tomcat来操作的,而拦截器是通过spring来实现的。

过滤器和拦截器的区别:拦截器是AOP思想的具体应用。

1.2 自定义拦截器


想要自定义拦截器,必须实现HandlerInterceptor接口。

直接一点就是实现了HandlerInterceptor接口的类就是一个拦截器。

定义一个拦截器类MyInterceptor:

package com.itholmes.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor 

    //return true; 就是放行,执行下一个拦截器。
    //return false; 就是不放行,不执行下一个拦截器,就拒绝访问。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
        System.out.println("===========处理前===========");
        return false;//不放行
        //return true;//放行
    

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 
        System.out.println("===========处理后===========");
    

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 
        System.out.println("===========清理===========");
    

有了拦截器,就得在springmvc的配置文件里面注册一下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       ">
    <!--1.注解驱动-->
    <mvc:annotation-driven/>
    <!--2.静态资源过滤,如果不配置我们的js文件加载不进去。-->
    <mvc:default-servlet-handler/>
    <!--3.扫描包-->
    <context:component-scan base-package="com.itholmes.controller"/>
    <!--4.视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--拦截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--
                这里的path就是拦截路径。
                    ?、/、/*和/**的区别配置:
                        "/index?"能够匹配到"/indexA","/indexB",可是不能匹配"/index",也不能匹配"/indexAA";请求

                        "/index*"能够匹配"/indexA","/indexAA",可是不能匹配"/index/A";index

                        "/index/*"能够匹配"/index/","/index/A","/index/AA","/index/ABC",可是不能匹配"/index",也不能匹配"/index/A/B";

                        "/index/**"能够匹配"/index/"下的多个子路径,好比"/index/A/B/C/D";
            -->
            <mvc:mapping path="/**"/>
            <bean class="com.itholmes.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

控制器类TestController :

package com.itholmes.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController 
    @GetMapping("/t1")
    public String test()
        System.out.println("TestController==test方法执行了");
        return "OK";
    

之后我们随便访问一个控制器,他就会显示这种效果。


?、/、/*和/**的区别配置:

  • "/index? :能够匹配到/indexA","/indexB",可是不能匹配"/index",也不能匹配"/indexAA";请求
  • "/index* :能够匹配/indexA","/indexAA",可是不能匹配"/index/A";index
  • "/index/* :能够匹配/index/","/index/A","/index/AA","/index/ABC",可是不能匹配 “/index”,也不能匹配"/index/A/B";
  • "/index/**:能够匹配/index/“下的多个子路径,好比”/index/A/B/C/D";

2. SpringMVC的上传文件

2.1 前端上传文件方式


SpringMVC可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下它是不能处理文件上传工作。如果想让SpringMVC的文件上传功能,则需要在上下文中配置MultipartResolver。

multipart/form-data类型:这种编码方式会以二进制流的方式来处理表单数据。

2.2 后台接受方式


第一步:导入commons-fileupload和javax.servlet-api两个包。

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.4</version>
</dependency>
<!--Servlet-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>

第二步:配置springmvc的核心配置文件。

  • SpringMVC为文件上传提供了直接支持,这种支持是即插即用的MultipartResolver实现。
  • SpringMVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC文件上传还是需要依赖Apache COmmons FileUpload的组件!

在springmvc-config.xml文件中,配置CommonsMultipartResolver类的一个bean对象,注意这里的bean对象名字不能错误!因为在Spring中有类在用它!

<!--文件上传的位置-->
<!--这里的id必须是multipartResolver,因为在Spring中有类在用它!-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--请求的编码格式,必须和jsp的pageEncoding属性一直,以便正确读取表单的内容,默认为ISO-8859-1-->
    <property name="defaultEncoding" value="utf-8"/>
    <!--上传文件大小上限,单位为字节(10485760)=10M-->
    <property name="maxUploadSize" value="10485760"/>
    <property name="maxInMemorySize" value="40960"/>
</bean>


第三步:配置Controller文件。

第一种方式:IO读取。

package com.itholmes.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;

@RestController
public class FileController 

	//第一种方式:
    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file")CommonsMultipartFile file, HttpServletRequest request) throws IOException 

        //获取文件名:file.getOriginalFilename();
        String uploadFileName = file.getOriginalFilename();
        //如果文件名为空,直接回到首页。
        if("".equals(uploadFileName))
            return "redirect:/index.jsp";
        
        System.out.println("上传文件名:"+uploadFileName);


        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        //如果路径不存在,创建一个
        File readPath = new File(path);
        if(!readPath.exists())
            readPath.mkdir();
        
        System.out.println("上传文件保存地址:"+readPath);


        //获取文件流
        InputStream is = file.getInputStream();
        OutputStream os = new FileOutputStream(new File(readPath, uploadFileName));
        //读取写出
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len=is.read(buffer))!=-1)
            os.write(buffer,0,len);
            os.flush();
        
        os.close();
        is.close();

        return "redirect:/index.jsp";
    


第二种方式:直接写到文件中。

package com.itholmes.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;

@RestController
public class FileController 

    @RequestMapping("/upload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException 
        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if(!realPath.exists())
            realPath.mkdir();
        

        //上传文件地址
        System.out.println("上传文件保存地址:"+realPath);

        //通过CommonsMultipartFile的方法直接写文件
        file.transferTo(new File(realPath+"/"+file.getOriginalFilename()));

        return "redirect:/index.jsp";
    



第四步:就直接测试就可以了。

  • 正常开发中,这些代码都是固定的格式,拿来即用!
  • 我们可以在target或out文件中能查看到。

3. SpringMVC的下载文件


文件下载步骤:

对应控制类写法:

package com.itholmes.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@RestController
public class FileController 

    @RequestMapping("/download")
    public String downloads(HttpServletResponse response,HttpServletRequest request) throws IOException 
        String path = request.getServletContext().getRealPath("/upload");
        String fileName = "项目.md";

        //1.设置response响应头
        response.reset();//设置页面不缓存,清空buffer
        response.setCharacterEncoding("utf-8");//设置字符编码
        response.setContentType("multipart/form-data");//二进制传输数据
        //设置响应头
        response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName,"UTF-8"));

        File file = new File(path, fileName);
        //2.读取文件--输入流
        InputStream input = new FileInputStream(file);
        //3.写出文件--输出流
        OutputStream out = response.getOutputStream();

        byte[] buff = new byte[1024];
        int index = 0;
        while ((index=input.read(buff))!=-1)
            out.write(buff,0,index);
            out.flush();
        
        out.close();
        input.close();
        return null;
    


4. 补充


ssm中如果遇到的一些坑,问题都会写到这里。

以上是关于spring mvc 文件上传怎么过滤文件类型,如exe文件等的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc 怎么大小上传文件控制?

Spring MVC框架 学习笔记总结

Spring mvc ajax文件上传导致415(不支持的媒体类型)

spring mvc怎么获取上传文件的原路径

java spring mvc 客户端上传文件到服务器端

ios的多文件上传java后台springmvc怎么写