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目录。
可以使用http://127.0.0.1:8080/index.html进行访问即可。
4.2、ServletContext 根目录下进行查找,注意,在 src/main/webapp目录名称必须要webapp。ServletContext目录就是src/main下面的webapp这个目录。
可以使用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默认的文件上传的大小是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