在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()方法来代替,因为它提供了更多的灵活性和错误处理机制。