SpringBoot整合Servlet、Filter、Listener、访问静态资源、文件上传

1、Springboot整合Servlet,分为两种方式,分别如下所示:

首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.2.6.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.bie</groupId>
12     <artifactId>springboot-hello</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>springboot-hello</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19     </properties>
20 
21     <dependencies>
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter-web</artifactId>
25         </dependency>
26 
27         <dependency>
28             <groupId>org.springframework.boot</groupId>
29             <artifactId>spring-boot-starter-test</artifactId>
30             <scope>test</scope>
31             <exclusions>
32                 <exclusion>
33                     <groupId>org.junit.vintage</groupId>
34                     <artifactId>junit-vintage-engine</artifactId>
35                 </exclusion>
36             </exclusions>
37         </dependency>
38     </dependencies>
39 
40     <build>
41         <plugins>
42             <plugin>
43                 <groupId>org.springframework.boot</groupId>
44                 <artifactId>spring-boot-maven-plugin</artifactId>
45             </plugin>
46         </plugins>
47     </build>
48 
49 </project>

 

1.1、通过注解扫描完成Servlet组件的注册。首先继承HttpServlet,然后使用注解@WebServlet(name = "annoationServlet", urlPatterns = "/annoationServlet")来完成Springboot对Servlet的整合。

 1 package com.bie.springboothello.servlet;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 
10 /**
11  * Springboot整合Servlet的方式一,通过注解扫描完成Servlet组件的注册。
12  * 1、传统的方式可以在web.xml配置文件中编写配置。
13  * 2、Springboot可以使用注解的方式来进行注解扫描。
14  */
15 @WebServlet(name = "annoationServlet", urlPatterns = "/annoationServlet")
16 public class AnnoationServlet extends HttpServlet {
17 
18     @Override
19     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
20         System.out.println("doGet通过注解扫描完成Servlet组件的注册");
21     }
22 
23     @Override
24     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
25         System.out.println("doPost通过注解扫描完成Servlet组件的注册");
26     }
27 
28 }

然后,在SpringBoot启动时会扫描@WebServlet,并将该类实例化。

 1 package com.bie.springboothello;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.web.servlet.ServletComponentScan;
 6 
 7 @SpringBootApplication
 8 @ServletComponentScan // 在SpringBoot启动时会扫描@WebServlet,并将该类实例化
 9 public class SpringbootHelloApplication {
10 
11     public static void main(String[] args) {
12         SpringApplication.run(SpringbootHelloApplication.class, args);
13     }
14 
15 }

1.2、通过方法完成Servlet组件的注册。

 1 package com.bie.springboothello.servlet;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.HttpServlet;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import java.io.IOException;
 8 
 9 /**
10  * 通过方法完成Servlet组件的注册。
11  */
12 public class MethodServlet extends HttpServlet {
13 
14     @Override
15     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
16         System.out.println("doGet通过方法完成Servlet组件的注册。");
17     }
18 
19     @Override
20     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
21         System.out.println("doPost通过方法完成Servlet组件的注册。");
22     }
23 
24 
25 }

通过在主启动类里面,编写返回ServletRegistrationBean类型的方法,ServletRegistrationBean该对象就是为我们注册Servlet的对象。

 1 package com.bie.springboothello;
 2 
 3 import com.bie.springboothello.servlet.MethodServlet;
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 7 import org.springframework.context.annotation.Bean;
 8 
 9 @SpringBootApplication
10 public class SpringbootHelloApplication {
11 
12     /**
13      * 1、ServletRegistrationBean该对象就是为我们注册Servlet的对象。
14      *
15      * @return
16      */
17     @Bean // 将该对象注册到容器中。
18     public ServletRegistrationBean getServletRegistrationBean() {
19         // 实例化自己定义的Servlet对象
20         ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MethodServlet());
21         // 指定urlPatterns,完成Servlet的urlPattern的配置。
22         registrationBean.addUrlMappings("/methodServlet");
23         // 返回该对象
24         return registrationBean;
25     }
26 
27     public static void main(String[] args) {
28         SpringApplication.run(SpringbootHelloApplication.class, args);
29     }
30 
31 
32 }

 

2、Springboot整合 Filter。

2.1、通过注解扫描完成 Filter 组件的注册。首先实现Filter接口,然后实现三个方法,然后使用注解@WebFilter(filterName = "annoationFilter", urlPatterns = "/annoationFilter")来完成Springboot对Filter的整合。

 1 package com.bie.springboothello.listener;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.annotation.WebFilter;
 5 import java.io.IOException;
 6 
 7 /**
 8  * SpringBoot整合 Filter方式一,通过注解扫描完成Filter组件的注册。
 9  * 1、urlPatterns是String数组类型的,可以拦截执行的类型。
10  */
11 // @WebFilter(filterName = "annoationFilter", urlPatterns = {"*.do", "*.jsp"})
12 @WebFilter(filterName = "annoationFilter", urlPatterns = "/annoationFilter")
13 public class AnnoationFilter implements Filter {
14 
15     @Override
16     public void init(FilterConfig filterConfig) throws ServletException {
17         System.out.println("通过注解扫描完成Filter组件的注册,初始化init方法!");
18     }
19 
20     @Override
21     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
22         System.out.println("通过注解扫描完成Filter组件的注册,过滤器doFilter开始执行方法!");
23         filterChain.doFilter(servletRequest, servletResponse);
24         System.out.println("通过注解扫描完成Filter组件的注册,过滤器doFilter执行结束方法!");
25     }
26 
27     @Override
28     public void destroy() {
29         System.out.println("通过注解扫描完成Filter组件的注册,销毁destroy方法!");
30     }
31 
32 }

然后,在SpringBoot启动时会扫描@WebServlet,并将该类实例化。

 1 package com.bie.springboothello;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.web.servlet.ServletComponentScan;
 6 
 7 @SpringBootApplication
 8 @ServletComponentScan // 在SpringBoot启动时会扫描@WebServlet,并将该类实例化
 9 public class SpringbootHelloApplication {
10 
11     public static void main(String[] args) {
12         SpringApplication.run(SpringbootHelloApplication.class, args);
13     }
14 
15 
16 }

2.2、通过方法完成 Filter 组件的注册。

 1 package com.bie.springboothello.filter;
 2 
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5 
 6 /**
 7  * SpringBoot整合 Filter方式一,通过方法完成 Filter 组件的注册。
 8  */
 9 public class MethodFilter implements Filter {
10 
11     @Override
12     public void init(FilterConfig filterConfig) throws ServletException {
13         System.out.println("通过方法完成 Filter 组件的注册,初始化init方法!");
14     }
15 
16     @Override
17     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
18         System.out.println("通过方法完成 Filter 组件的注册,过滤器doFilter开始执行方法!");
19         filterChain.doFilter(servletRequest, servletResponse);
20         System.out.println("通过方法完成 Filter 组件的注册,过滤器doFilter执行结束方法!");
21     }
22 
23     @Override
24     public void destroy() {
25         System.out.println("通过方法完成 Filter 组件的注册,销毁destroy方法!");
26     }
27 
28 }

通过在主启动类里面,编写返回 FilterRegistrationBean 类型的方法,FilterRegistrationBean 该对象就是为我们注册Servlet的对象。

 1 package com.bie.springboothello;
 2 
 3 import com.bie.springboothello.filter.MethodFilter;
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 7 import org.springframework.context.annotation.Bean;
 8 
 9 @SpringBootApplication
10 public class SpringbootHelloApplication {
11 
12     /**
13      * FilterRegistrationBean该对象就是为我们注册 Filter 的对象。
14      *
15      * @return
16      */
17     @Bean // 注册Bean
18     public FilterRegistrationBean getFilterRegistrationBean() {
19         // 实例化自己定义的Servlet对象
20         FilterRegistrationBean registrationBean = new FilterRegistrationBean(new MethodFilter());
21         // 指定urlPatterns,完成Servlet的urlPattern的配置。
22         // bean.addUrlPatterns(new String[]{"*.do","*.jsp"});
23         registrationBean.addUrlPatterns("/methodFilter");
24         // 返回该对象
25         return registrationBean;
26     }
27 
28     public static void main(String[] args) {
29         SpringApplication.run(SpringbootHelloApplication.class, args);
30     }
31 
32 
33 }

 

3、Springboot整合 Listener。

3.1、通过注解扫描完成 Listener 组件的注册。首先实现 ServletContextListener 接口,然后实现两个个方法,使用注解@WebListener将该监听器添加到容器中。

 1 package com.bie.springboothello.listener;
 2 
 3 import javax.servlet.ServletContextEvent;
 4 import javax.servlet.ServletContextListener;
 5 import javax.servlet.annotation.WebListener;
 6 
 7 /**
 8  * 监听器,需要什么监听器取决于要实现那个监听器.Springboot整合Listener
 9  */
10 @WebListener
11 public class AnnoationListener implements ServletContextListener {
12 
13     @Override
14     public void contextInitialized(ServletContextEvent sce) {
15         System.out.println("通过注解扫描完成Listener组件的注册,Listener...init......");
16     }
17 
18     @Override
19     public void contextDestroyed(ServletContextEvent sce) {
20         System.out.println("通过注解扫描完成Listener组件的注册,Listener...destroyed......");
21     }
22 
23 }

然后,在SpringBoot启动时会扫描@WebListener,并将该类实例化。

 1 package com.bie.springboothello;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.web.servlet.ServletComponentScan;
 6 
 7 @SpringBootApplication
 8 @ServletComponentScan // 在SpringBoot启动时会扫描@WebServlet,并将该类实例化
 9 public class SpringbootHelloApplication {
10 
11     public static void main(String[] args) {
12         SpringApplication.run(SpringbootHelloApplication.class, args);
13     }
14 
15 
16 }

3.2、通过方法完成 Listener 组件注册。

 1 package com.bie.springboothello.listener;
 2 
 3 import javax.servlet.ServletContextEvent;
 4 import javax.servlet.ServletContextListener;
 5 
 6 public class MethodListener implements ServletContextListener {
 7 
 8     @Override
 9     public void contextInitialized(ServletContextEvent sce) {
10         System.out.println("通过方法完成 Listener 组件注册,Listener...init......");
11     }
12 
13     @Override
14     public void contextDestroyed(ServletContextEvent sce) {
15         System.out.println("通过方法完成 Listener 组件注册,Listener...destroyed......");
16     }
17 }

通过在主启动类里面,编写返回 ServletListenerRegistrationBean<MethodListener> 类型的方法,ServletListenerRegistrationBean<MethodListener>该对象就是为我们注册Listener的对象。

 1 package com.bie.springboothello;
 2 
 3 import com.bie.springboothello.listener.MethodListener;
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
 7 import org.springframework.context.annotation.Bean;
 8 
 9 @SpringBootApplication
10 public class SpringbootHelloApplication {
11 
12     /**
13      * 提供方法注册Listener监听器
14      *
15      * @return
16      */
17     @Bean
18     public ServletListenerRegistrationBean<MethodListener> getServletListenerRegistrationBean() {
19         // 泛型就是需要实例化的监听器对象。
20         ServletListenerRegistrationBean<MethodListener> registrationBean = new ServletListenerRegistrationBean<MethodListener>(new MethodListener());
21         return registrationBean;
22     }
23 
24     public static void main(String[] args) {
25         SpringApplication.run(SpringbootHelloApplication.class, args);
26     }
27 
28 
29 }

 

4、Springboot访问静态资源。

4.1、SpringBoot 从 classpath/static 的目录,注意,目录名称必须是 static,这里的classpath就是指的src\main\resources目录。

SpringBoot整合Servlet、Filter、Listener、访问静态资源、文件上传

可以使用http://127.0.0.1:8080/index.html进行访问即可。

4.2、ServletContext 根目录下进行查找,注意,在 src/main/webapp目录名称必须要webapp。ServletContext目录就是src/main下面的webapp这个目录。
SpringBoot整合Servlet、Filter、Listener、访问静态资源、文件上传

可以使用http://127.0.0.1:8080/index.html进行访问即可。

 

5、SpringBoot文件上传。遇到的错误,如下所示:

 1 .   ____          _            __ _ _
 2  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
 3 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 4  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
 5   '  |____| .__|_| |_|_| |_\__, | / / / /
 6  =========|_|==============|___/=/_/_/_/
 7  :: Spring Boot ::        (v2.2.6.RELEASE)
 8 
 9 2020-05-06 19:37:38.233  INFO 8744 --- [           main] c.b.s.SpringbootHelloApplication         : Starting SpringbootHelloApplication on DESKTOP-V37QSSE with PID 8744 (D:\program\idea\IntelliJ IDEA 2019.1.3\workspace_idea\springboot-hello\target\classes started by biehl in D:\program\idea\IntelliJ IDEA 2019.1.3\workspace_idea\springboot-hello)
10 2020-05-06 19:37:38.245  INFO 8744 --- [           main] c.b.s.SpringbootHelloApplication         : No active profile set, falling back to default profiles: default
11 2020-05-06 19:37:39.598  INFO 8744 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
12 2020-05-06 19:37:39.613  INFO 8744 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
13 2020-05-06 19:37:39.614  INFO 8744 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
14 2020-05-06 19:37:39.701  INFO 8744 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
15 2020-05-06 19:37:39.701  INFO 8744 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1316 ms
16 2020-05-06 19:37:39.881  INFO 8744 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
17 2020-05-06 19:37:39.938  INFO 8744 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
18 2020-05-06 19:37:40.047  INFO 8744 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
19 2020-05-06 19:37:40.050  INFO 8744 --- [           main] c.b.s.SpringbootHelloApplication         : Started SpringbootHelloApplication in 2.303 seconds (JVM running for 5.065)
20 2020-05-06 19:38:03.806  INFO 8744 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
21 2020-05-06 19:38:03.807  INFO 8744 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
22 2020-05-06 19:38:03.812  INFO 8744 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
23 文件的名称: 电脑密码.txt
24 2020-05-06 19:38:41.227 ERROR 8744 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
25 
26 java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Cannot write uploaded file to disk!
27     at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:122) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
28     at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.transferTo(StandardMultipartHttpServletRequest.java:256) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
29     at com.bie.springboothello.uploadFile.FileUploadController.fileUpload(FileUploadController.java:31) ~[classes/:na]
30     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
31     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
32     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
33     at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
34     at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
35     at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
36     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
37     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
38     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
39     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
40     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
41     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
42     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
43     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
44     at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
45     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
46     at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
47     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
48     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
49     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.33.jar:9.0.33]
50     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
51     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
52     at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
53     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
54     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
55     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
56     at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
57     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
58     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
59     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
60     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
61     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
62     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
63     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
64     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
65     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.33.jar:9.0.33]
66     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.33.jar:9.0.33]
67     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.33.jar:9.0.33]
68     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.33.jar:9.0.33]
69     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.33.jar:9.0.33]
70     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.33.jar:9.0.33]
71     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) [tomcat-embed-core-9.0.33.jar:9.0.33]
72     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.33.jar:9.0.33]
73     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.33.jar:9.0.33]
74     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) [tomcat-embed-core-9.0.33.jar:9.0.33]
75     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.33.jar:9.0.33]
76     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
77     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
78     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.33.jar:9.0.33]
79     at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
80 Caused by: org.apache.tomcat.util.http.fileupload.FileUploadException: Cannot write uploaded file to disk!
81     at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.write(DiskFileItem.java:396) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
82     at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:120) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
83     ... 52 common frames omitted

这里说明一下,我上传的文件名称是中文的,文件大小几百k,不会出现超过1M的问题,当然有的会是这个原因造成的,具体情况具体分析。

1 // 正确的写法
2 filename.transferTo(new File("F:\\BaiduNetdiskDownload" + filename.getOriginalFilename()));
3 
4 // 错误的写法
5 // filename.transferTo(new File("F:\\BaiduNetdiskDownload"));

我的前端代码是这样的,简单模拟一下子。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>文件上传</title>
 6 </head>
 7 <body>
 8 
 9 <!-- 文件上传 -->
10 <form action="/fileUpload" method="post" enctype="multipart/form-data">
11     上传文件:<input type="file" name="filename"/><br/>
12     <input type="submit"/>
13 </form>
14 
15 </body>
16 </html>

控制层的代码是这样的。需要注意的是输入框file类型的name属性的值filename必须和MultipartFile filename参数名称一致的。而且form表单的enctype="multipart/form-data"类型必须是这样的。

 1 package com.bie.springboothello.uploadFile;
 2 
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RestController;
 5 import org.springframework.web.multipart.MultipartFile;
 6 
 7 import java.io.File;
 8 import java.io.IOException;
 9 import java.util.HashMap;
10 import java.util.Map;
11 
12 /**
13  *
14  */
15 @RestController // 此类下所有方法的返回值都会做Json格式的转换,标识该类下的方法的返回值会自动做json格式的转换。
16 public class FileUploadController {
17 
18     /**
19      * 处理文件上传
20      *
21      * @param filename 此处参数的名称必须和表单的输入框file类型的名称是一致的。
22      * @return
23      */
24     @RequestMapping(value = "fileUpload")
25     public Map<String, Object> fileUpload(MultipartFile filename) throws IOException {
26         // 创建Map对象
27         Map<String, Object> map = new HashMap<String, Object>();
28         // 打印上传的文件的名称
29         System.out.println("文件的名称: " + filename.getOriginalFilename());
30         // 文件的保存
31         filename.transferTo(new File("F:\\BaiduNetdiskDownload" + filename.getOriginalFilename()));
32         // filename.transferTo(new File("F:\\BaiduNetdiskDownload"));
33         // 设置返回值
34         map.put("msg", "ok.");
35         return map;
36     }
37 
38 }

运行效果,如下所示:

SpringBoot整合Servlet、Filter、Listener、访问静态资源、文件上传

提交成功之后,可以到指定的磁盘目录进行查看即可。

注意:设置上传文件大小的默认值,Springboot默认的文件上传的大小是10M。注意,不同springboot版本参数设置不同。

 1 server.port=8080
 2 
 3 # 设置单个上传文件的大小,springboot1.5.10.RELEASE版本使用的配置
 4 # spring.http.multipart.maxFileSize=200MB
 5 # 设置一次请求上传文件的总容量,springboot1.5.10.RELEASE版本使用的配置
 6 # spring.http.multipart.maxRequestSize=200MB
 7 
 8 # 设置单个上传文件的大小,springboot2.2.6.RELEASE版本使用的配置
 9 spring.servlet.multipart.max-file-size=200MB
10 # 设置一次请求上传文件的总容量,springboot2.2.6.RELEASE版本使用的配置
11 spring.servlet.multipart.max-request-size=200MB

 

上一篇:14_Filter&Listener


下一篇:oracle关闭监听log.xml文件生成步骤