SpringBoot 如何实现文件上传和下载
当今Web应用程序通常需要支持文件上传和下载功能,Spring Boot提供了简单且易于使用的方式来实现这些功能。在本篇文章中,我们将介绍Spring Boot如何实现文件上传和下载,同时提供相应的代码示例。

文件上传
Spring Boot提供了Multipart文件上传的支持。Multipart是HTTP协议中的一种方式,用于支持文件上传。下面我们将介绍如何在Spring Boot中实现文件上传。
依赖
在开始之前,我们需要在pom.xml文件中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
此外,如果您希望使用Thymeleaf进行模板渲染,可以添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置
在application.properties文件中添加以下配置:
# 文件上传的最大值
spring.servlet.multipart.max-file-size=10MB
# 文件请求的最大值
spring.servlet.multipart.max-request-size=10MB
# 临时文件存储路径
spring.servlet.multipart.location=/tmp
Controller
在Spring Boot中实现文件上传需要编写一个Controller,其中包含两个方法,一个用于返回上传文件的表单页面,另一个用于实际处理文件上传。
@Controller
public class FileUploadController {@GetMapping("/upload")public String uploadForm(Model model) {return "upload";}@PostMapping("/upload")public String uploadFile(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {if (file.isEmpty()) {redirectAttributes.addFlashAttribute("message", "Please select a file to upload");return "redirect:upload";}try {// 保存文件byte[] bytes = file.getBytes();Path path = Paths.get("/tmp/" + file.getOriginalFilename());Files.write(path, bytes);redirectAttributes.addFlashAttribute("message", "You successfully uploaded '" + file.getOriginalFilename() + "'");} catch (IOException e) {e.printStackTrace();}return "redirect:upload";}
}
在上面的代码中,我们定义了一个GET请求处理方法uploadForm,它返回一个上传文件的表单页面。在POST请求处理方法uploadFile中,我们使用@RequestParam注解获取上传的文件,然后将其保存到指定的路径中。如果文件为空,我们将重定向到上传表单页面,并显示错误消息。如果文件上传成功,我们将重定向到上传表单页面,并显示成功消息。
模板
为了使上传表单页面显示在浏览器中,我们需要创建一个Thymeleaf模板文件upload.html,其中包含上传表单页面的HTML代码。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>File Upload</title>
</head>
<body><div th:if="${message}" class="alert alert-success" th:text="${message}"></div><form method="post" enctype="multipart/form-data" th:action="@{/upload}"><div class="form-group"><label for="file">Select a file to upload:</label><input type="file" id="file" name="file"></div><button type="submit" class="btn btn-primary">Upload</button></form>
</body>
</html>
在上面的代码中,我们使用Thymeleaf的if语句和text属性显示上传成功或失败的消息。我们还使用Thymeleaf的action属性指定表单提交的URL,enctype属性设置表单的编码类型为multipart/form-data,这是文件上传时必须使用的编码类型。
运行
现在我们已经完成了文件上传的代码和模板,我们可以运行Spring Boot应用程序,并在浏览器中访问/upload路径,即可看到上传表单页面。选择要上传的文件并点击“上传”按钮,文件将被保存到指定的路径中。
文件下载
Spring Boot提供了简单的方式来实现文件下载。下面我们将介绍如何在Spring Boot中实现文件下载。
Controller
与文件上传类似,我们需要编写一个Controller来处理文件下载请求。在Controller中,我们可以使用ResponseEntity来将文件内容发送到浏览器。
@Controller
public class FileDownloadController {@GetMapping("/download")public ResponseEntity<Resource> downloadFile() throws IOException {Path path = Paths.get("/tmp/file.txt");Resource resource = new InputStreamResource(Files.newInputStream(path));HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.txt");return ResponseEntity.ok().headers(headers).contentLength(Files.size(path)).contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource### 模板为了使文件下载工作,我们需要在浏览器中添加一个链接或按钮,该链接或按钮将触发文件下载。我们可以将该链接或按钮包含在一个HTML文件中。下面是一个使用Thymeleaf的HTML文件示例:```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>File Download</title>
</head>
<body><a th:href="@{/download}" class="btn btn-primary">Download File</a>
</body>
</html>
在上面的代码中,我们使用Thymeleaf的href属性指定文件下载的URL,这里指向/download。
运行
现在我们已经完成了文件下载的代码和模板,我们可以运行Spring Boot应用程序,并在浏览器中访问/download路径,即可开始文件下载。点击链接或按钮,浏览器将下载文件并将其保存到本地磁盘中。
总结
在本文中,我们介绍了Spring Boot如何实现文件上传和下载,包括依赖、配置、Controller和模板的编写。通过本文,您应该能够了解文件上传和下载在Spring Boot中的实现方式,并可以使用相应的代码示例进行实践。Spring Boot提供了简单且易于使用的方式来实现文件上传和下载,这对于许多Web应用程序来说是非常重要的功能。在实现文件上传和下载时,需要注意安全性和文件大小的限制,并根据实际需求进行相应的配置。
相关文章:
SpringBoot 如何实现文件上传和下载
当今Web应用程序通常需要支持文件上传和下载功能,Spring Boot提供了简单且易于使用的方式来实现这些功能。在本篇文章中,我们将介绍Spring Boot如何实现文件上传和下载,同时提供相应的代码示例。 文件上传 Spring Boot提供了Multipart文件上…...
Linux系统下imx6ull QT编程—— Ubuntu 下编写程序(一)
Linux QT编程 文章目录 Linux QT编程前言一、C简介二、C环境设置1.安装编译 C 语言和 C的环境。2.创建文件编写代码3.编译运行代码 总结 前言 绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一个 C源文件。通过编写最简单的示例“Hello,World QCX”。 一、C简介 C (c…...
网络编程--多线程服务器客户端
写在前面 此前的回声服务器/客户端都是在主线程中阻塞交互,本文将使用多线程方式实现服务器/客户端。 互斥量相关接口 使用多线程,自然避免不了线程同步问题。 因本文使用互斥量实现线程同步,因此仅介绍互斥量相关接口,其他实…...
如何使用vue的计算属性来处理数据计算?
计算属性是Vue.js中非常强大的功能,它可以帮助我们轻松地处理数据计算和管理数据。 先说个段子:有一天,一个新手问一个Vue大师,“大师,我的数据计算和管理怎么那么麻烦?”,大师回答:…...
游戏研发项目管理
基于阶段模式进行游戏新产品研发过程,以及基于这种研发过程使用Leangoo 领歌敏捷工具管理 二、游戏产品开发流程 通常开发一款新游戏大体上会按照如下流程来进行: 1) 概念阶段 – Concept 主策根据产品创意,确定游戏策划草案&a…...
P1249 乘积最大
最大乘积 题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如 3 1 2 312 312, 4 1 3 413 413, 5 = 1 4 2 3 5=1423 5=1423, 6 1 5 = 2 4 615=24 …...
【7 Vue3 – Composition API】
1 认识Composition API Options API的弊端 setup函数 2 setup函数的参数 3 setup简单使用 1 注意不再有响应式数据 要做到响应式数据需要在数据定义时使用ref包装数据,并且在使用时,使用value解包 2 注意template要使用的数据或者函数,必须要return 返回才能被使用 <templa…...
设计模式-模板方法模式
模板方法模式 问题背景解决方案:模板方法模式基本介绍解决问题代码示例运行结果 钩子方法注意事项和细节 问题背景 豆浆的制作: 1)制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎 2)通过添加不同…...
9. python的if语句
文章目录 一、if结构1.1 比较符号1.1.1 使用比较两个数据是否相等:1.1.2 使用!号比较数据是否不相等1.1.3 使用<号比较数字大小关系1.1.4 使用<号比较数字大小关系1.1.5 使用>号比较数字大小关系1.1.6 使用>号比较数字大小关系 1.2 关键字1.2.1 and关键…...
并发编程的基础知识
并发编程的优缺点 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动…...
C 语言风格的字符串,非 string 类如何初始化字符串,以及操作字符串的函数(C++复习向p12)
C 风格的字符串 以 C 风格初始化字符串,有这 2 种方法。其中的 ‘\0’ 是字符串结束符号,是 null 字符 char site[7] {R, U, N, O, O, B, \0}; char site[] "RUNOOB";C 中操作字符串的函数 (以null结尾的字符串) strcpy(s1, s2) 把 s2 复…...
Linux文件系统、磁盘I/O是怎么工作的?
同CPU、内存一样,文件系统和磁盘I/O,也是Linux操作系统最核心的功能。磁盘为系统提供了最基本的持久化存储。文件系统则在磁盘基础上,提供了一个用来管理文件的树状结构。 目录: 一. 文件系统 1. 索引节点和目录项 2. 虚拟文件系…...
设计原则之接口隔离原则
tip: 需要《设计模式之禅》的书籍,可以联系我 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 相关规则: 1.6大设计规则-迪米特法则 …...
ubuntu20.04 ffmpeg mp4转AES加密的m3u8分片视频
样本视频(时长2分35秒): 大雄兔_百度百科 大雄兔_百度百科不知大家否看过世界上第一部开源电影:Elephants Dream(大象之梦)。这是一部由主要由开源软件Blender制作的电影短片,证明了用开源软件也能制作出效果媲美大公司的作品。…...
Java08——继承
1. 继承 父类: package com.zsq.extend.improve_; //是pupil和graduate的父类 public class Student {public String name;public int age;private double score;public void info(){System.out.println("姓名:" name " 年龄࿱…...
C++高级语法
文章目录 C高级语法面向对象 -- 类/结构体抽象-具体类型 标准I/O流I/O流I/O缓存区 文件操作头文件的重复包含问题深拷贝和浅拷贝,写时复制面向对象的三大特性面向对象是什么 C高级语法 面向对象 – 类/结构体 C使用class定义一个类,使用struct定义一个…...
React学习笔记九-高阶函数与函数柯里化
此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第九篇,主要介绍高阶函数与函数柯里化。 高阶函数,和函数的柯里化,是学习react的拓展,方便以后优化代码,更好的学习react。…...
2023年电工杯B题半成品论文使用讲解
注:蓝色字体为说明备注解释字体,不能出现在大家的论文里。黑色字体为论文部分,大家可以根据红色字体的注记进行摘抄。该文件为半成品论文,即引导大家每一步做什么,怎么做,展示按着本团队的解题思路进行建模…...
第1关:ODBC程序设计
第1关:ODBC程序设计 任务描述相关知识ODBC主要功能ODBC接口主要函数ODBC应用程序开发实例DM ODBC应用程序开发总体流程DM ODBC代码编写流程DM ODBC代码编写实例 编程要求测试说明代码参考: 任务描述 本关任务:使用 ODBC 查询表中数据。 相关…...
Kotlin笔记(零)简介
百度百科简介 2017年,google公司在官网上宣布Kotlin成为Android的开发语言,使编码效率大增。Kotlin 语言由 JetBrains 公司推出,这是一个面向JVM的新语言 参考资料 官网:https://kotlinlang.org/中文官网:https://w…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
