1. 准备
- springboot构建项目的基本知识
- thymeleaf的相关知识
- JDK1.8、idea2018
2. 新建工程
2.1 修改pom.xml
引入Thymeleaf、web相关依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2 新建页面
- 新建一个uoload.html用于文件上传
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>文件上传页面</title>
</head>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" ><br>
<input type="submit" value="上传">
</form>
</body>
</html>
enctype=“multipart/form-data” 是必须的,表示提交二进制文件
- 新建一个ok.html页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>上传成功</title>
</head>
<body>
<div th:if="${fileName}">
<h2 th:text="|${fileName} 上传成功,存储路径为 :${path}|"> </h2>
</div>
</body>
</html>
2.3 修改application.properties文件
# 最大支持文件大小
spring.servlet.multipart.max-file-size=100MB
# 最大支持请求大小
spring.servlet.multipart.max-request-size=100MB
#默认支持文件上传
spring.servlet.multipart.enabled=true
#支持文件写入磁盘.
spring.servlet.multipart.file-size-threshold=0
# 上传文件的临时目录
spring.servlet.multipart.location=
设置上传文件的大小,默认是1m,太小了,文件超过1M就会出错,这里设置成100M
2.4 controller类
新建一个UploadController类:
package com.eknaij.springbootupload;
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.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@Controller
public class UploadController {
@GetMapping("/")
public String uploladPage(){
return "upload";
}
@PostMapping("/upload")
public String fileUpload(
@RequestParam("file") MultipartFile file, HttpServletRequest req, Model model){
try {
String fileName = System.currentTimeMillis()+file.getOriginalFilename();
String destFileName=req.getServletContext().getRealPath("")+"uploaded"+ File.separator+fileName;
File destFile = new File(destFileName);
destFile.getParentFile().mkdirs();
System.out.println(destFile);
file.transferTo(destFile);
model.addAttribute("fileName",fileName);
model.addAttribute("path",destFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
return "上传失败," + e.getMessage();
} catch (IOException e) {
e.printStackTrace();
return "上传失败," + e.getMessage();
}
return "OK";
}
}
MultipartFile是Spring上传文件的封装类,包含了文件的二进制流和文件属性等信息,在配置文件中也可对相关属性进行配置,基本的配置信息如下:
spring.http.multipart.enabled=true #默认支持文件上传.
spring.http.multipart.file-size-threshold=0 #支持文件写入磁盘.
spring.http.multipart.location=# 上传文件的临时目录
spring.http.multipart.max-file-size=1Mb # 最大支持文件大小
spring.http.multipart.max-request-size=10Mb # 最大支持请求大小
最常用的是最后两个配置内容,限制文件上传大小,上传时超过大小会抛出异常。
几点说明:
@RequestParam("file") MultipartFile file
接收上传的文件,MultipartFile上面已经解释System.currentTimeMillis()+file.getOriginalFilename()
根据上传时间给文件命名,避免重名上传后覆盖前文件req.getServletContext().getRealPath("")
获取当前项目的服务器路径File destFile = new File(destFileName);destFile.getParentFile().mkdirs();
第一次运行的时候,这个文件所在的目录往往是不存在的,这里需要创建一下目录file.transferTo(destFile);
把浏览器上传的文件复制到希望的位置
3. 运行
上传页面:
上传成功页面:
可以复制路径去文件夹里看一下:
本文源码已上传github,需要的请自取:本文源码地址