在Spring Boot中,文件上传可以使用MultipartFile
来处理。下面将为你演示如何进行单文件和多文件上传。
一、单文件上传
1.1 首先,你需要创建一个表单界面来选择和上传单个文件。在HTML中,你可以使用类似于下面的表单:
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">上传</button>
</form>
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)
值 | 描述 |
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 |
text/plain | 空格转换为 “+” 加号,但不对特殊字符编码。 |
1.2 接下来,在你的控制器中,你可以使用MultipartFile
参数来处理上传的文件。例如,你可以创建一个POST请求处理方法来处理文件上传:
1.2.1 使用transferTo()
方法将上传的文件保存到指定的位置
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
// ...
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
// 检查文件是否为空
if (!file.isEmpty()) {
//获得文件原始名称
String originalFilename = file.getOriginalFilename();
//使用transferTo()方法将上传的文件保存到指定的位置
file.transferTo(new File("H:\\cache\\"+originalFilename));
}
return "文件上传成功!";
}
1.2.2 使用Files.write()
方法将文件写入指定路径。
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
// 保存文件到服务器
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
// 这里可以自定义文件保存路径和文件名
Path path = Paths.get("uploads/" + file.getOriginalFilename());
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
return "文件上传成功!";
}
二、多文件上传
如果你想要实现多文件上传,只需稍作调整即可。在表单中,你可以使用multiple
属性来允许选择多个文件:
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<button type="submit">上传</button>
</form>
然后,在你的控制器中,你可以使用MultipartFile[]
参数来处理多个文件的上传。例如:
2.1 使用transferTo()
方法将上传的文件保存到指定的位置:
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("files") MultipartFile[] files) {
if(files.length > 0){
for (MultipartFile file: files) {
if(!file.isEmpty()){
String originalFilename = file.getOriginalFilename();
file.transferTo(new File("H:\\cache\\"+originalFilename));
}
}
return "文件上传成功!";
}
2.2 使用Files.write()
方法将文件写入指定路径。
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("files") MultipartFile[] files) {
// 检查文件是否为空
if (files.length == 0) {
return "请选择至少一个文件进行上传.";
}
// 保存文件到服务器
for (MultipartFile file : files) {
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
// 这里可以自定义文件保存路径和文件名
Path path = Paths.get("uploads/" + file.getOriginalFilename());
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "文件上传成功!";
}
三、总结
尽管使用transferTo()
方法也可以实现文件保存,但在Spring Boot中,更推荐使用Files.write()
方法来代替,因为它提供了更多的灵活性和错误处理机制。