文件上传与下载
项目目录
新建个项目:springboot-file
pom.xml
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.keafmd</groupId> <artifactId>springboot-file</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--devtools--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 解析jsp类库 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies> </project>
启动类
启动类AppFile:
package com.keafmd; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Keafmd * * @ClassName: AppFile * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-07 15:08 * @Blog: https://keafmd.blog.csdn.net/ */ @SpringBootApplication public class AppFile { public static void main(String[] args) { SpringApplication.run(AppFile.class,args); } }
controller
BootConstants:
package com.keafmd.controller; /** * Keafmd * * @ClassName: BootConstants * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-07 16:07 * @Blog: https://keafmd.blog.csdn.net/ */ public interface BootConstants { public static final String UPLOAD_DIR ="D:\\upload"; }
FileUploadController :
package com.keafmd.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; /** * Keafmd * * @ClassName: FileUploadController * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-07 15:05 * @Blog: https://keafmd.blog.csdn.net/ */ @Controller public class FileUploadController { @PostMapping("upload") String upload(MultipartFile pic) throws IOException { //1 将临时空间的文件,转储到 D:\\upload String originalFileName = pic.getOriginalFilename(); //扩展名 String ext = originalFileName.substring(originalFileName.lastIndexOf(".")); //转储的新文件名 String newFileName = UUID.randomUUID().toString() + ext; //转储到 D:\\upload 下的 uuid.png/uuid.jpg pic.transferTo(new File(BootConstants.UPLOAD_DIR, newFileName)); //2 将数据存储到 db /** * 当前时间 * 上传的ip * 操作的工号 * 上传的文件名 * */ //3 跳转到列表页 return "redirect:/list"; } @GetMapping("list") String list(Model model) throws IOException { File[] list = new File(BootConstants.UPLOAD_DIR).listFiles(); model.addAttribute("fileList",list); return "/list.jsp"; } }
DownloadController :
package com.keafmd.controller; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import javax.servlet.http.HttpServletResponse; import java.io.*; /** * Keafmd * * @ClassName: DownloadController * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-07 16:10 * @Blog: https://keafmd.blog.csdn.net/ */ @Controller public class DownloadController { /** * 3000 * * 1024 1024 (2048) 954 * * * @param path * @param response * @throws IOException */ @GetMapping("/d1/{path}") public void download(@PathVariable String path , HttpServletResponse response) throws IOException { response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.addHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename="+path); InputStream is = new FileInputStream(new File(BootConstants.UPLOAD_DIR,path)); OutputStream os = response.getOutputStream(); int len = -1; byte[] bytes = new byte[1024]; while ( (len = is.read(bytes)) != -1){ os.write(bytes,0,len); } os.close(); is.close(); } @GetMapping("/d2/{path}") public ResponseEntity download2(@PathVariable String path ) throws IOException { return ResponseEntity.ok(). header(HttpHeaders.CONTENT_TYPE,"application/octet-stream"). header(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename="+path). body(new FileSystemResource(new File(BootConstants.UPLOAD_DIR,path))); } }
AppConfig :
package com.keafmd.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * Keafmd * * @ClassName: AppConfig * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-07 16:05 * @Blog: https://keafmd.blog.csdn.net/ */ @Configuration public class AppConfig implements WebMvcConfigurer { /** * http://127.0.0.1/form * @param registry */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/form").setViewName("/upload.jsp"); } /** * http://127.0.0.1/down/ae37a66f-aec3-4e23-b2ed-7267adcfb2bb.png * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/down/**").addResourceLocations("file:D:\\upload\\"); } }
application.yml
server: port: 80
SpringBoot集成使用jsp(超详细)
jsp
list.jsp:
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/4/7 Time: 15:07 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <table border="1" cellspacing="0" cellpadding="0" width="100%"> <tr> <th>序号</th> <th>文件名称</th> <th>操作</th> </tr> <c:forEach items="${fileList}" var="file" varStatus="stat"> <tr> <td>${stat.count}</td> <td>${file.getName()}</td> <td> <a href="${pageContext.request.contextPath}/down/04971284-d789-470a-a991-4d690c36b4ac.jpg">下载1</a> <a href="${pageContext.request.contextPath}/d1/04971284-d789-470a-a991-4d690c36b4ac.jpg">下载2</a> <a href="${pageContext.request.contextPath}/d2/04971284-d789-470a-a991-4d690c36b4ac.jpg">下载3</a> </td> </tr> </c:forEach> </table> </body> </html>
upload.jsp:
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/4/7 Time: 16:10 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form method="post" action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data"> <input type="file" name="pic"> <input type="submit" value="上传头像" > </form> </body> </html>
效果
上传:
下载:
SpringBoot数据校验
问题引入
我们在传参的时候,有时候需要对传的参数进行验证是否符合要求,这就需要就行数据校验了。
样例代码
说明:SpringBoot的2.2.x版本之前,如果使用starter-web默认包含校验框架,2.3.x之后或者没有使用starter-web,需要添加starter-validation的校验框架。
common的pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>spring-boot-02</artifactId> <groupId>com.keafmd</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>common</artifactId> <dependencies> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency> </dependencies> </project>
spring-boot-06的pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.keafmd</groupId> <artifactId>spring-boot-06</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-06</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.keafmd</groupId> <artifactId>common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
common的实体类User:
package com.keafmd.entity; import lombok.Data; import javax.validation.constraints.Max; import java.util.Date; /** * Keafmd * * @ClassName: User * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 9:07 * @Blog: https://keafmd.blog.csdn.net/ */ @Data public class User { private String id; @Max(value = 18,message = "年龄不符合") private Integer age; private String address; private Date createTime; }
UserController:
package com.keafmd.controller; import com.keafmd.entity.User; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Keafmd * * @ClassName: UserController * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 9:10 * @Blog: https://keafmd.blog.csdn.net/ */ @RestController @RequestMapping("user") public class UserController { /** * http://127.0.0.1/user/save?age=20 * @param user * @return */ @RequestMapping("save") User save(@Validated User user,BindingResult bindingResult){ System.out.println(bindingResult.getFieldError().getDefaultMessage()); return user; } }
SpringBoot06Application
package com.keafmd; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBoot06Application { public static void main(String[] args) { SpringApplication.run(SpringBoot06Application.class, args); } }
效果
浏览器访问:http://127.0.0.1/user/save?age=20
idea控制台的输出信息:
注册Servlet三大组件【Servlet、Filter、Listener】
使用ServletComponentScan注解扫描
在启动类上添加@ServletComponentScan
SpringBoot06Application:
package com.keafmd; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @ServletComponentScan public class SpringBoot06Application { public static void main(String[] args) { SpringApplication.run(SpringBoot06Application.class, args); } }
定义Servlet
FirstSerlvet :
package com.keafmd.servletcomponent; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Keafmd * * @ClassName: FirstSerlvet * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 9:55 * @Blog: https://keafmd.blog.csdn.net/ */ /** * http://127.0.0.1/my */ @WebServlet(urlPatterns = "/my") public class FirstSerlvet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("FirstSerlvet.doPost"); System.out.println("sessionid: "+req.getSession().getId()); } }
定义的Filter
FirstFilter:
package com.keafmd.servletcomponent; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * Keafmd * * @ClassName: FirstFilter * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 9:56 * @Blog: https://keafmd.blog.csdn.net/ */ @WebFilter(urlPatterns="/*") public class FirstFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("FirstFilter.doFilter"); filterChain.doFilter(servletRequest,servletResponse); } }
定义Listener
FirstListener:
package com.keafmd.servletcomponent; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Keafmd * * @ClassName: FirstListener * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 9:57 * @Blog: https://keafmd.blog.csdn.net/ */ @WebListener public class FirstListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("FirstListener.sessionCreated: Session被创建"); } }
效果
访问后,前端不会有什么效果。
idea的控制台的输出证明使用成功。
注意:当我们二次访问http://127.0.0.1/my的时候session应该是一样的。
使用registration的Bean注册组件
三大组件使用代码(不需要,@WebListener、@WebServlet(urlPatterns = “/servlet”)、@WebFilter(urlPatterns = “/*”))
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.keafmd</groupId> <artifactId>spring-boot-07</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-07</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
application.yml:
server:
port: 80
使用@Bean配合RegistrationBean类型注册
Appconfig:
package com.keafmd.servlet.config; import com.keafmd.servlet.component.MySessionListener; import com.keafmd.servlet.component.SecondFilter; import com.keafmd.servlet.component.SecondServlet; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * Keafmd * * @ClassName: Appconfig * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 17:40 * @Blog: https://keafmd.blog.csdn.net/ */ @Configuration(proxyBeanMethods = false) public class Appconfig implements WebMvcConfigurer { // 使用@Bean配合RegistrationBean类型注册 -- star /** * http://127.0.0.1:80/sec * http://127.0.0.1:80/second * @return */ @Bean ServletRegistrationBean getServletRegistrationBean(){ ServletRegistrationBean<SecondServlet> registrationBean = new ServletRegistrationBean<SecondServlet>(); registrationBean.setServlet(new SecondServlet()); registrationBean.addUrlMappings("/sec","/second"); return registrationBean; } @Bean FilterRegistrationBean getFilterRegistrationBean(){ FilterRegistrationBean<SecondFilter> registrationBean = new FilterRegistrationBean<SecondFilter>(); registrationBean.setFilter(new SecondFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } @Bean ServletListenerRegistrationBean getServletListenerRegistrationBean(){ ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(); registrationBean.setListener(new MySessionListener()); return registrationBean; } // 使用@Bean配合RegistrationBean类型注册 -- end /* 使用Bean注解定义跨域的Filter*/ @Bean FilterRegistrationBean<CorsFilter> cors(){ FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<CorsFilter>(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); CorsFilter filter = new CorsFilter(source); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); return registrationBean; } // 另外一种跨域方式 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedHeaders("*").allowedOrigins("*").allowedMethods("*"); } }
定义Servlet
SecondServlet:
package com.keafmd.servlet.component; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Keafmd * * @ClassName: SecondServlet * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 17:41 * @Blog: https://keafmd.blog.csdn.net/ */ public class SecondServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("SecondServlet.doGet"); System.out.println("sessionid: "+req.getSession().getId()); } }
定义Filter
SecondFilter:
package com.keafmd.servlet.component; import javax.servlet.*; import java.io.IOException; /** * Keafmd * * @ClassName: SecondFilter * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 17:41 * @Blog: https://keafmd.blog.csdn.net/ */ public class SecondFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("SecondFilter.doFilter 生效了"); chain.doFilter(request, response); } }
定义Listener
package com.keafmd.servlet.component; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Keafmd * * @ClassName: MySessionListener * @Description: * @author: 牛哄哄的柯南 * @Date: 2021-04-08 17:42 * @Blog: https://keafmd.blog.csdn.net/ */ public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("Session对象被创建"); } @Override public void sessionDestroyed(HttpSessionEvent se) { } }
使用Bean注解定义跨域的Filter
Appconfig部分代码:
// 使用Bean注解定义跨域的Filter @Bean FilterRegistrationBean<CorsFilter> cors(){ FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<CorsFilter>(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); CorsFilter filter = new CorsFilter(source); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); return registrationBean; }
第二种跨域方式
Appconfig部分代码:
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedHeaders("*").allowedOrigins("*").allowedMethods("*"); }
效果
idea控制台输出效果:
以上就是SpringBoot的Web开发支持【超详细【一篇搞定】】的全部内容。