平时我们在开发中需要上传文件到云服务器中,今天我们来用一个小demo演示如何基于SpringBoot上传文件。(这个小demo我们是上传到本地存储下)
首先我们修改一下页面代码
<form role="form" th:action="@{/upload}" method="post" enctype="multipart/form-data">
<!--此处省略-->
<div class="form-group">
<label for="exampleInputFile">头像</label>
<input type="file" name="headImg" id="exampleInputFile">
</div>
<div class="form-group">
<label for="exampleInputFile">生活照</label>
<input type="file" name="photos" multiple>
</div>
注意:我们上传照片method应该设置为"post",另外enctype属性在使用包含文件上传控件的表单时,必须使用该值(multipart/form-data)。此处的生活照,我们设计是一次性上传多张图片,因此我们应该加上multiple属性,效果如下:
然后,我们建立一个上传文件的类并标注为@Controller
/**
* @Author Kk
* @Date 2022/2/6 15:40
* @Description 文件上传测试
*/
@Slf4j
@Controller
public class FormTestController {
@GetMapping("/form_layouts")
public String formLayout(){
return "/form/form_layouts";
}
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headImg") MultipartFile headImg,
//因为是上传多个文件,这里我们使用数组类型
@RequestPart("photos") MultipartFile[] photos) throws IOException {
log.info("上传的信息:email={},username={},headImg={},photos={}",
email,username,headImg.getSize(),photos.length);
//如果不为空我们便上传
if (!headImg.isEmpty()){
//获取文件的原始文件名
String originalFilename = headImg.getOriginalFilename();
//保存到服务器transferTo()方法
headImg.transferTo(new File("D:\\Saved Pictures\\upload\\"+originalFilename));
}
//如果接收过来的数组不为空便遍历出每个文件,然后上传
if (photos.length > 0){
for (MultipartFile photo : photos){
String originalFilename = photo.getOriginalFilename();
photo.transferTo(new File("D:\\Saved Pictures\\upload\\"+originalFilename));
}
}
return "main";
}
}
经过测试,我们可以发现目标路径下已经存在我们刚刚上传的图片