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 实现文件上传下载功能 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Maven的聚合(多模块)和Parent继承

    Maven作为一个管理Java工程的强大工具,支持多模块(聚合)的构建和Parent继承机制。下面我们将详细讲解这两个功能的使用方法。 什么是Maven的聚合(多模块)? 在Maven中,聚合是指将多个子模块(即多个Maven项目)组合起来进行维护和构建,这种方式称为多模块构建。多模块构建可以将不同的依赖和资源管理在不同的模块中,实现更好的分离和管理。 创建…

    Java 2023年5月19日
    00
  • Java中读取文件转换为字符串的方法

    想要读取文件并将其转换为字符串,可以使用Java中的流和缓冲区来实现。具体实现过程如下: 使用Java中的File类打开要读取的文件,可以使用文件的路径或URI来指定文件。例如,打开当前路径下的test.txt文件: File file = new File("test.txt"); 构造一个FileReader对象以读取文件内容。如果需…

    Java 2023年5月27日
    00
  • 利用JSP session对象保持住登录状态

    利用JSP的session对象可以实现用户登录状态的保持和管理,下面是完整的攻略: 创建登录页面 创建一个简单的登录页面,包含一个用户名和密码的表单,在提交时向服务器发送POST请求。 示例代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu…

    Java 2023年6月15日
    00
  • Java自定义长度可变数组的操作

    下面就给您讲解一下Java自定义长度可变数组的操作的完整攻略。 概述 在Java语言中,数组是一组相同数据类型元素的集合。创建数组时需要指定数组的长度,一旦数组长度被确定,就无法改变。但是在实际开发中,有一些场景需要使用可变长度的数组,这是怎么实现的呢? 实现原理 Java提供了List接口来实现可变长度的数组,List接口的实现类多种多样,常用的有Arra…

    Java 2023年5月26日
    00
  • Java封装数组之改进为泛型数组操作详解

    Java封装数组之改进为泛型数组操作详解 在Java程序开发中,经常会使用数组来存储和处理数据,但是传统的数组存储方式存在类型不安全、代码冗长等问题,为了解决这些问题,Java提供了泛型数组,即封装数组。本文将详细介绍Java封装数组的概念,封装原理以及如何改进为泛型数组的操作步骤和技巧。 一、概念 Java封装数组是指在类中定义数组变量,封装了数组的属性和…

    Java 2023年5月26日
    00
  • .net socket客户端实例代码分享

    在这里我将详细介绍“.net socket客户端实例代码分享”的完整攻略,并提供两条示例代码。 什么是.net socket客户端? .net socket客户端是一种基于Socket技术的网络编程模型,使用.net framework中的Socket类来建立与服务器的连接,进行数据传输等操作。它常用于需要高效、快速、灵活地进行网络通讯的应用场景。 .net…

    Java 2023年5月19日
    00
  • Spring Security OAuth2 token权限隔离实例解析

    Spring Security OAuth2 token权限隔离实例解析 在本文中,将介绍如何使用Spring Security来实现OAuth2 token的权限隔离。我们将阐述基于Spring Boot的实现方式及其持久化方案,并提供两条示例。 情境描述 假设一个应用程序需要提供给多个客户端进行访问,而每个客户端都有自己的用户组并需要访问特定的资源。在这…

    Java 2023年5月20日
    00
  • java中String与StringBuilder的区别

    请允许我详细讲解“java中String与StringBuilder的区别”。 1. String与StringBuilder的定义 String类是Java内置的一个不可变的字符串类。每当我们对一个字符串进行操作的时候,都会创建一个新的字符串对象,这会导致很多的垃圾内存产生。而StringBuilder类是Java内置的可变字符串类,它可以进行多次修改而不…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部