Spring Boot + thymeleaf 实现文件上传下载功能

下面我将详细讲解“Spring Boot + Thymeleaf 实现文件上传下载功能”的完整攻略。

下面我将详细讲解“Spring Boot + Thymeleaf 实现文件上传下载功能”的完整攻略。

准备工作

在开始前,请确保你已经具备以下环境:

  • JDK1.8及以上
  • Maven 3.0及以上

项目搭建

  1. 建立一个 Spring Boot 项目

可以通过 Spring Initializr 快速搭建,选择 Web 依赖和 Thymeleaf 模板引擎即可。

  1. 引入依赖

在 pom.xml 中引入文件上传下载所需的依赖:

<!-- 文件上传 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 文件下载 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>
  1. 编写上传文件页面

在 templates 文件夹下新建 upload.html 文件,并编写上传文件页面的 html 代码,以下是一个简单示例:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<h2>文件上传</h2>
<!–- enctype="multipart/form-data" 必须加上,否则无法上传文件 -–>
<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <br/><br/>
    <input type="submit" value="上传"/>
</form>
</body>
</html>
  1. 新建 Controller

在 controller 包下新建 UploadController.java 文件,并编写文件上传和下载的代码。

@Controller
public class UploadController {

    //上传文件页面
    @GetMapping("/upload")
    public String upload() {
        return "upload";
    }

    //处理文件上传
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上传失败,请选择文件";
        }
        try {
            // 获取文件名
            String fileName = file.getOriginalFilename();
            // 获取文件的后缀名
            String suffixName = fileName.substring(fileName.lastIndexOf("."));
            // 文件上传路径
            String filePath = "C:/temp/";
            // 解决中文问题,liunx下中文路径,图片显示问题
            fileName = UUID.randomUUID() + suffixName;
            File dest = new File(filePath + fileName);
            // 检测是否存在目录
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();// 新建文件夹
            }
            file.transferTo(dest);// 文件写入
            return "上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传失败!";
    }

    //下载文件
    @GetMapping("/download/{fileName}")
    public ResponseEntity<byte[]> download(@PathVariable("fileName") String fileName) throws IOException {
        // 文件上传路径
        String filePath = "C:/temp/";
        File file = new File(filePath + fileName);
        HttpHeaders headers = new HttpHeaders();
        //下载显示的文件名,解决中文名称乱码问题
        String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
        //通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFileName);
        //application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
    }
}

在上面的代码中,文件上传路径为 C:/temp/,你可以根据需要修改文件上传路径和下载路径。此外,为了避免文件名重复,上传文件会以随机 UUID 重新命名。

  1. 编译运行测试

在浏览器中访问 http://localhost:8080/upload ,上传文件即可。文件上传成功后,访问 http://localhost:8080/download/文件名 可以下载文件。

示例

下面给出两个文件上传下载的示例。

示例一:上传本地的文件

在上传文件页面中添加一个选择文件的 input ,代码如下:

<input type="file" name="file"/>

上传本地的文件后,可以在上传成功后的页面看到上传的文件名和下载链接。点击下载链接即可下载该文件。

示例二:上传 base64 编码的文件

在上传文件页面中添加一个 textarea,用来输入 base64 编码后的文件内容,代码如下:

<textarea name="file" rows="5" cols="50"></textarea>

文件上传时,需要对 base64 编码后的文件内容进行解码,代码如下:

// 将 base64 编码的字符串转换成 byte 数组
byte[] bytes = Base64Utils.decodeFromString(fileContent);
// 文件上传路径
String filePath = "C:/temp/";
// 将解码后的文件内容写入文件
FileUtils.writeByteArrayToFile(new File(filePath + fileName), bytes);

上传成功后,同样可以在页面上看到上传的文件名和下载链接。

结语

以上就是 Spring Boot + Thymeleaf 实现文件上传下载功能的完整攻略,希望可以帮助到你。如果你有任何问题或建议,请在评论区留言,我会及时回复你。

本文标题为:Spring Boot + thymeleaf 实现文件上传下载功能

基础教程推荐