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日

相关文章

  • SpringBoot+Thymeleaf+ECharts实现大数据可视化(基础篇)

    对于这个话题,我将详细讲解“SpringBoot+Thymeleaf+ECharts实现大数据可视化(基础篇)”的完整攻略。 概述 该项目是基于SpringBoot和Thymeleaf的Web项目,使用ECharts实现大数据可视化,展现统计图表。在本篇攻略中,我们将讲解如何使用SpringBoot和Thymeleaf搭建Web项目,并使用ECharts实现…

    Java 2023年5月20日
    00
  • java动态规划算法——硬币找零问题实例分析

    Java 动态规划算法——硬币找零问题实例分析 简介 硬币找零问题是一类非常经典的问题,主要是如何计算出需要多少硬币才能凑够给定的金额。动态规划是解决硬币找零问题的一种常用算法。本文将介绍动态规划算法的工作原理及其在硬币找零问题中的应用。 动态规划算法 动态规划算法(Dynamic Programming)是一种解决问题的思想,它将问题拆分成若干个子问题,并…

    Java 2023年5月26日
    00
  • MyBatis-Ext快速入门实战

    MyBatis-Ext快速入门实战攻略 MyBatis-Ext是MyBatis的一个增强工具包,可以提供更加便捷的使用方式,提高开发效率。本文将提供一个MyBatis-Ext的快速入门实战攻略,包含配置、实现及示例演示。 配置 引入MyBatis-Ext的依赖 xml <dependency> <groupId>com.github.…

    Java 2023年5月20日
    00
  • EasyUI框架 使用Ajax提交注册信息的实现代码

    接下来我将详细讲解“EasyUI框架 使用Ajax提交注册信息的实现代码”的完整攻略。 首先,我们需要在我们的网页中引入EasyUI框架的JavaScript和CSS文件,可以使用以下链接引入: <link rel="stylesheet" type="text/css" href="https://c…

    Java 2023年5月20日
    00
  • Java util concurrent及基本线程原理简介

    Java util concurrent及基本线程原理简介 线程基本概念 线程是操作系统进行任务调度和执行的基本单位,一个进程可以拥有多个线程。 线程是轻量级的,相对于进程来说占用较少的资源。 线程也是并发编程的基石,不同的线程可以同时执行不同的任务,提高了应用程序的并发性。 线程的状态 新建状态 线程是尚未启动的状态,实例化了一个Thread对象,还未调用…

    Java 2023年5月18日
    00
  • 什么是线程安全的共享对象?

    以下是关于线程安全的共享对象的完整使用攻略: 什么是线程安全的共享对象? 线程安全的共享对象是指多个线程可以同时访问的对象,而不会出现数据不一致或程序崩溃等问题。在多线程编程中,线程安全的共享对象是非常重要的,因为当多个线程同时访问共享对象时,可能会出现线程间争的问题,导致数据不一致或程序崩溃。 线程安全的共享对象的示例 以下两个示例,分别演示了线程安全的共…

    Java 2023年5月12日
    00
  • Spring SpringMVC,Spring整合MyBatis 事务配置的详细流程

    下面是关于Spring、SpringMVC和MyBatis整合以及事务配置的详细流程,包含两个示例说明。 Spring、SpringMVC和MyBatis整合以及事务配置 Spring、SpringMVC和MyBatis是Java Web应用程序开发中常用的框架。在本文中,我们将介绍如何将这三个框架整合在一起,并配置事务管理。 步骤1:添加依赖 首先,我们需…

    Java 2023年5月17日
    00
  • jmeter添加自定函数的实例(jmeter5.3+IntelliJ IDEA)

    下面我将为你讲解“jmeter添加自定函数的实例(jmeter5.3+IntelliJ IDEA)”的攻略: 1. 准备工作 1.1 下载安装Java Development Kit(JDK) 在JMeter中开发自定义Java代码,需要安装好JDK,并设置好JAVA_HOME环境变量。下载地址:https://www.oracle.com/java/tec…

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