Spring Boot 学习(一) 文件上传
注意:
跳转html文件一定要放在同一个静态资源文件夹下,否则会出现各种报错
文件上传:
首先编写html的form表单提交,对于form表单的上传记得添加enctype,对于多文件上传,需要在input标签下添加multiple
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>form</h1> <form method="post" action="/world/upload" enctype="multipart/form-data"> 用户名:<input type="text" name="username"><br> 上传文件:<input type="file" name="userimg"><br> 多文件:<input type="file" name="photo" multiple><br> <button type="submit">提交</button> </form> </body> </html>
其次编写关于文件上传的Controller,跳转页面使用Get请求,与此同时表单提交的html在form文件夹下,此时需要添加对于路径,文件上传需要用到post请求,值得注意的是获取文件属性是通过注解@RequestPart来实现,
package com.sp.Controller; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @Slf4j @Controller public class FromSubmit { @GetMapping("/form") public String form_submit() { return "form/formSubmit"; } @PostMapping("/upload") public String upload(@RequestParam("username") String username, @RequestPart("userimg") MultipartFile userimg, //MultipartFile会自动封装上传的文件 @RequestPart("photo") MultipartFile[] photo) { //多文件上传保存在数组中 log.info("上传的信息:username = {}, userimg = {}, photo = {}", username, userimg.getSize(), photo.length); return "index"; //跳转到index页面 } }
之后对html上传的文件传输到本地的磁盘中保存
通过transferTo方法,以及文件流里的方法获取文件名,文件大小等方法
@PostMapping("/upload")
public String upload(@RequestParam("username") String username,
@RequestPart("userimg") MultipartFile userimg, //MultipartFile会自动封装上传的文件
@RequestPart("photo") MultipartFile[] photos) throws IOException {
log.info("上传的信息:username = {}, userimg = {}, photo = {}",
username, userimg.getSize(), photos.length);
if (!userimg.isEmpty()) {
//获取原始的文件名
String originalFilename = userimg.getOriginalFilename();
//保存文件到指定的本地目录
userimg.transferTo(new File("D:\\code\\img\\"+originalFilename));
}
if (photos.length > 0) {
for (MultipartFile photo:photos) {
if(!photo.isEmpty()) {
String originalFilename = photo.getOriginalFilename(); //获取文件的原始名字
photo.getSize(); //获取文件大小
photo.transferTo(new File("D:\\code\\img\\"+originalFilename));
}
}
}
return "index";
}
运行之后在本地就有了图片信息

这里需要注意的几个点:
1..如果配置了拦截器,那么如果需要测试的情况,则在对应的请求上添加不拦截的部分,如果是登陆的话可以不加,在登陆也完成拦截情况的处理
2.关于页面跳转的问题,如果对应的html页面在不同的文件夹下,那么需要将其放在同一静态资源文件夹,否则很容易产生报错
3.关于文件上传,springboot默认配置了最大上传的大小,此时需要更改上传文件大小
4.关于多文件上传,需要将其保存在一个数组中@RequestPart("photo") MultipartFile[] photo
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB

在springboot中有一个MultipartAutoConfiguration,里面对应的组件
@EnableConfigurationProperties(MultipartProperties.class)
中默认声明了文件大小,单张照片最大1MB,最多总请求量最大10MB
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false) public class MultipartProperties { /** * Whether to enable support of multipart uploads. */ private boolean enabled = true; /** * Intermediate location of uploaded files. */ private String location; /** * Max file size. */ private DataSize maxFileSize = DataSize.ofMegabytes(1); /** * Max request size. */ private DataSize maxRequestSize = DataSize.ofMegabytes(10); /** * Threshold after which files are written to disk. */ private DataSize fileSizeThreshold = DataSize.ofBytes(0); /** * Whether to resolve the multipart request lazily at the time of file or parameter * access. */ private boolean resolveLazily = false;

浙公网安备 33010602011771号