在企业级项目开发过程中,上传文件是最常用到的功能。SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入。下面我们来创建一个SpringBoot项目完成单个、多个文件的上传。
本文目标:
使用SpringBoot项目完成单个、多个文件的上传处理,并将上传的文件保存到指定目录下。
一、项目的创建:
项目目录:
我们使用InteiilJ IDEA工具构建一个SpringBoot项目,项目先加入Web、JSP、Servlet依赖(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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.dyh</groupId> <artifactId>lesson_ten</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>lesson_ten</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.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!--<scope>provided</scope>--> </dependency> <!-- spring boot tomcat jsp 支持开启 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!-- servlet 支持开启 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </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> </plugin> </plugins> </build> </project>
二、文件application.properties文件配置
1、配置application.properties文件支持JSP页面的访问,配置preffix以及suffix路径转发规则。
2、加入spring.http.multipart.max-file-size以及spring.http.multipart.max-request-size配置信息。还有其他配置信息,可以搜索。
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.http.multipart.max-file-size=1024Mb
spring.http.multipart.max-request-size=2048Mb
三、书写jsp文件
注意:属性enctype="multipart/form-data"
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 单个文件上传:<br/> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="submit" value="提交上传"/> </form> <br/> 多个文件上传: <form action="/uploads" method="post" enctype="multipart/form-data"> 文件1:<input type="file" name="file"/><br/> 文件2:<input type="file" name="file"/><br/> 文件3:<input type="file" name="file"/><br/> <input type="submit" value="上传多个文件"/> </form> </body> </html>
四、核心代码,上传单个或多个文件
@Controller public class UploadController { /** * 初始化上传文件界面,跳转到index.jsp */ @RequestMapping(value = "/index",method = RequestMethod.GET) public String index(){ return "index"; } /** * 提取上传方法为公共方法 * @param uploadDir 上传文件目录 * @param file 上传对象 * @throws Exception */ private void executeUpload(String uploadDir,MultipartFile file) throws Exception{ //文件后缀名 String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); //上传文件名 String filename = UUID.randomUUID() + suffix; //服务器端保存的文件对象 File serverFile = new File(uploadDir + filename); //将上传的文件写入到服务器端文件内 file.transferTo(serverFile); } /** * 上传文件方法 * @param file 前台上传的文件对象 */ @RequestMapping(value = "/upload",method = RequestMethod.POST) public @ResponseBody String upload(HttpServletRequest request, MultipartFile file){ try { //上传目录地址 String uploadDir = request.getSession().getServletContext().getRealPath("/") +"upload/"; //如果目录不存在,自动创建文件夹 File dir = new File(uploadDir); if(!dir.exists()) { dir.mkdir(); } //调用上传方法 executeUpload(uploadDir,file); }catch (Exception e) { //打印错误堆栈信息 e.printStackTrace(); return "上传失败"; } return "上传成功"; } /** * 上传多个文件 * @param request 请求对象 * @param file 上传文件集合 */ @RequestMapping(value = "/uploads",method = RequestMethod.POST) public @ResponseBody String uploads(HttpServletRequest request,MultipartFile[] file) { try { //上传目录地址 String uploadDir = request.getSession().getServletContext().getRealPath("/") +"upload/"; //如果目录不存在,自动创建文件夹 File dir = new File(uploadDir); if(!dir.exists()) { dir.mkdir(); } //遍历文件数组执行上传 for (int i =0;i<file.length;i++) { if(file[i] != null) { //调用上传方法 executeUpload(uploadDir, file[i]); } } }catch (Exception e) { //打印错误堆栈信息 e.printStackTrace(); return "上传失败"; } return "上传成功"; } }
五、测试:
总结:
主要讲解了SringBoot项目如何上传单个、多个文件到服务器端指定目录下,上传时修改限制上传文件容量大小,上传文件的命名规则等