基于SpringBoot实现文件上传和下载(详细讲解And附完整代码)

目录

一、基于SpringBoot实现文件上传和下载基于理论

二、详细操作步骤

文件上传步骤:

文件下载步骤:

三、前后端交互原理解释 

四、小结 


博主介绍:✌专注于前后端领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦!

🍅文末三连哦🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

一、基于SpringBoot实现文件上传和下载基于理论

在Spring Boot中实现文件上传和下载通常涉及到使用Spring MVC的MultipartFile类来处理文件上传,同时配置一个Controller来处理上传和下载请求。

在Spring Boot中实现文件上传和下载通常遵循以下步骤:

  1. 配置文件上传位置和大小限制: 首先,需要在Spring Boot应用的配置文件(如application.properties)中配置文件上传的位置和大小限制。这通常涉及设置spring.servlet.multipart相关属性。你可以指定上传文件的最大大小、临时文件路径等。

  2. 创建文件上传表单页面: 在前端创建一个包含文件上传表单的页面,通常使用HTML和表单标签来实现。表单中必须有一个input标签的type属性为file,用户通过这个输入框选择要上传的文件。

  3. 处理文件上传请求: 在后端创建一个Controller来处理文件上传请求。这个Controller需要能够接收上传的文件,并将文件保存到指定的位置。在Spring Boot中,你可以使用@RequestParam注解来接收MultipartFile对象,然后使用其transferTo()方法将文件保存到目标位置。

  4. 提供文件下载接口: 创建另一个Controller来处理文件下载请求。这个Controller需要能够根据文件名或其他标识符找到对应的文件,并将其内容以流的形式返回给客户端。在Spring Boot中,你可以使用ResponseEntity来封装文件的响应,并设置适当的HTTP头部,使浏览器能够下载文件。

二、详细操作步骤

文件上传步骤:

  1. 创建上传目录: 在服务器上创建一个目录,用于存储上传的文件。确保这个目录具有足够的权限,以便应用程序可以向其中写入文件。

  2. 配置文件上传属性:application.properties文件中配置文件上传的属性,包括上传目录的路径、文件大小限制等。

    spring.servlet.multipart.max-file-size=10MB
    spring.servlet.multipart.max-request-size=10MB
    

  3. 创建文件上传表单: 在前端页面中创建一个表单,允许用户选择要上传的文件。

<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit">Upload</button>
</form>

    4.处理文件上传请求: 创建一个Controller来处理文件上传请求,并将文件保存到指定的位置。 

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;@RestController
public class FileUploadController {@PostMapping("/upload")public String handleFileUpload(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return "Please select a file to upload.";}try {byte[] bytes = file.getBytes();String uploadDir = "/path/to/upload/directory/";File uploadedFile = new File(uploadDir + file.getOriginalFilename());file.transferTo(uploadedFile);return "File uploaded successfully!";} catch (IOException e) {e.printStackTrace();return "File upload failed!";}}
}

 

文件下载步骤:

  1. 创建文件下载接口: 创建一个Controller来处理文件下载请求,并根据文件名找到对应的文件,并将其内容以流的形式返回给客户端。

    import org.springframework.core.io.Resource;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.List;
    import java.util.stream.Collectors;@Controller
    public class FileDownloadController {private static final String FILE_DIRECTORY = "/path/to/upload/directory/";@GetMapping("/download/{fileName:.+}")@ResponseBodypublic ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {Path filePath = Paths.get(FILE_DIRECTORY).resolve(fileName).normalize();try {Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri());if (resource.exists() || resource.isReadable()) {return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").body(resource);} else {return ResponseEntity.notFound().build();}} catch (IOException ex) {ex.printStackTrace();return ResponseEntity.status(500).build();}}
    }
    

三、前后端交互原理解释 

<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit">Upload</button>
</form>

在这里对代码进行详细的注释:

客户端实现发送一个 POST 请求到 `/upload` 路径通常是通过浏览器中的 HTML 表单来完成的。在你提供的 HTML 代码中,已经有一个表单,它会将文件上传到服务器。

让我们解释一下这段 HTML 代码:

- `<form>` 标签定义了一个表单,它将会提交数据到指定的 URL(在 `action` 属性中定义)。在这里,`action` 属性的值是 `/upload`,意味着表单将数据提交给服务器上的 `/upload` 路径。

- `method` 属性定义了表单的提交方法。在这里,设置为 `post`,表示将使用 POST 请求提交数据。

- `enctype` 属性定义了表单数据编码的类型。在这里,设置为 `multipart/form-data`,用于支持文件上传。

- `<input type="file" name="file">` 定义了一个文件选择输入框,允许用户选择要上传的文件。`name` 属性设置为 `file`,这个值与后端控制器方法中的 `@RequestParam("file")` 对应,用于接收上传的文件。

- `<button type="submit">Upload</button>` 定义了一个提交按钮,当用户点击它时,表单将被提交到服务器上的 `/upload` 路径。

因此,当用户在浏览器中选择一个文件并点击“上传”按钮时,浏览器将会发送一个 POST 请求到服务器上的 `/upload` 路径,上传文件数据将随请求一起发送到服务器,后端控制器将接收这个请求并处理文件上传逻辑。

这个表单指定了一个提交目标为/upload的POST请求,并设置了enctype属性为multipart/form-data,以支持文件上传。

当用户在浏览器中选择要上传的文件并点击“上传”按钮时,浏览器将选定的文件作为HTTP请求的一部分发送到服务器。

在服务器端,Spring Boot应用中的FileUploadController接收这个上传请求,并通过@RequestParam("file") MultipartFile file注解来接收上传的文件。Spring Boot中的MultipartFile对象代表了上传的文件,你可以通过它来获取文件名、文件类型、文件内容等信息,并使用transferTo()方法将文件保存到服务器的指定位置。

在这个示例中,上传的文件被保存在服务器的指定目录下,具体路径由变量uploadDir指定。

// 代码存储路径
String uploadDir = "/path/to/upload/directory/";
File uploadedFile = new File(uploadDir + file.getOriginalFilename());
file.transferTo(uploadedFile);

所以,上传的文件实际上是存储在服务器的文件系统中,而不是前端。一旦文件被上传到服务器,后端应用就可以对它进行处理,例如存储到数据库中,或者提供下载接口让用户下载该文件。

四、小结 

以上内容总结如下:

1. Spring Boot中实现文件上传和下载:
   - 在Spring Boot中,文件上传和下载通常涉及使用Spring MVC的`MultipartFile`类处理文件上传,并配置一个Controller来处理上传和下载请求。

2.文件上传步骤:
   - 配置文件上传位置和大小限制。
   - 创建文件上传表单页面,使用HTML表单标签,其中包含一个`input`标签的`type`属性为`file`。
   - 后端Controller处理文件上传请求,使用`@RequestParam("file") MultipartFile file`注解来接收上传的文件,并将文件保存到指定位置。

3. 文件下载步骤:
   - 创建另一个Controller处理文件下载请求,根据文件名找到对应的文件,并将其内容以流的形式返回给客户端。

4. 在前端使用Controller作为映射路径:
   - 配置Spring Boot以解析静态资源,并将HTML文件放置在静态资源目录下。
   - 在控制器中定义文件上传路径,使用`@GetMapping`或`@RequestMapping`注解指定控制器路径作为映射路径。
   - 在HTML表单中使用控制器路径,将控制器路径作为表单的`action`属性值。

通过以上步骤,你可以在Spring Boot中实现文件上传和下载,并在前端使用控制器作为映射路径,从而建立起清晰的路由结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCSA(第一天)

1.部署Linux环境&#xff1a; 安装Vmware之后&#xff0c;在windows会产生两个虚拟网卡&#xff1a;vmnet1&#xff0c; vmnet8 部署Linux&#xff1a;需要有网卡&#xff0c;必须要知道root用户的密码&#xff0c;和你普通的用户的用户名和密码 远程连接配置&#xff1a…

BGP报文、邻居状态

BGP报文&#xff1a; 1、OPEN报文&#xff1a;用于建立BGP邻居的连接&#xff0c;协商BGP参数的报文。 2、update报文&#xff1a;用于BGP邻居之间交互路由信息及路由属性的报文。 3、notification报文&#xff1a;差错报文&#xff0c;用于报错信息的传递&#xff0c;并且中…

LeetCode-热题100:1.两数之和

题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

Linux:文件读取指令

Linux&#xff1a;文件读取指令 cat指令more指令less指令head指令 & tail指令grep指令 cat指令 cat指令用于查看目标文件的内容。 语法&#xff1a;cat [选项][文件] 比如直接使用cat读取一个文件&#xff1a; 可以看到&#xff0c;其直接在指令的下方&#xff0c;输出了t…

Python中错误和异常的区别你搞清楚了吗?

​ 在Python编程的世界里&#xff0c;错误&#xff08;Error&#xff09;和异常&#xff08;Exception&#xff09;都是用来处理运行时出现的问题的。但它们之间有着微妙的差别&#xff0c;今天我们就来弄清楚。 错误&#xff08;Error&#xff09;通常指的是那些更严重、不可…

OrangeDAO联合创始人Don Ho确认出席Hack.Summit() 2024区块链开发者大会

随着Web3技术的快速发展&#xff0c;区块链领域备受关注的盛会——Hack.Summit() 2024 区块链开发者大会即将于 2024 年 4 月 9 日至 10 日在香港数码港隆重启幕。本次大会不仅是 Hack.Summit() 系列在亚洲的首次亮相&#xff0c;更象征着全球区块链行业对亚洲&#xff0c;尤其…

HBM产品在本财年内将为美光带来数亿美元的收入

美光科技&#xff0c;作为美国的主要内存制造商&#xff0c;得益于人工智能&#xff08;AI&#xff09;市场需求的增长&#xff0c;在截至2月份的上一季度成功扭亏为盈&#xff0c;并给出了乐观的财务预测。在3月20日的财报电话会议上&#xff0c;美光科技CEO桑杰梅赫罗特拉表示…

python基础知识(三)基本编程题,应用题

基本编程题 1.从键盘输入一个整数和一个字符&#xff0c;以逗号隔开&#xff0c;在屏慕上显示输出一条信息。 示例如下: 输入&#xff1a; 10, 输出&#xff1a; 10 s input("请输入一个整数和一个字符&#xff0c;用逗号隔开&#xff1a;")l s.split(",&q…

3.2 CSS选择器

3.2.1 元素选择器 在CSS中最常见的选择器就是元素选择器&#xff0c;即采用HTML文档中的元素名称进行样式规定。元素选择器又称为类型选择器&#xff0c;可以用于匹配HTML文档中某一个元素类型的所有元素。 例如&#xff0c;匹配所有的段落元素<p>&#xff0c;并将其背景…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

GC日志打印

GC日志打印 java -jar -Xloggc:./gc-%t.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintGCTimeStamps -XX:PrintGCCause -XX: UseGCLogFileRotation -XX:NumberOfGCLogFiles10 -XX:GCLogFileSize100M xxxxxx.jar%t 当前时间戳 -Xloggc:./gc-%t.log: 将日志记录到当前…

Linux之udp/tcp协议

之前我们已经初步了解了端口号&#xff01; 今天我们首先就要更加深入了解端口号&#xff01; 在 TCP/IP 协议中 , 用 " 源 IP", " 源端口号 ", " 目的 IP", " 目的端口号 ", " 协议号 " 这样一个五元组来标识一个通信 其…

LeetCode每日一题——x 的平方根

x 的平方根OJ链接&#xff1a;69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 乍一看题目只需要算一个数的平方根&#xff0c;根据我们之前学的C语言我们能很快的想到使用sqrt&#xff0c;pow这类的<math.h>库函数&#xf…

ChatGPT助力:写出引人注目的学术论文

ChatGPT无限次数:点击直达 ChatGPT助力&#xff1a;撰写引人注目的学术论文 在学术领域&#xff0c;撰写引人注目的论文对于展示研究成果和获取认可至关重要。本文将介绍一些关键策略和技巧&#xff0c;帮助您撰写引人注目的学术论文。 选题精准 一篇引人注目的学术论文首先…

redis瘦身版

线程模型 纯内存操作/非阻塞io多路复用/单线程避免多线程频繁上下文切换 基于Reactor模式开发了网络事件处理器&#xff1a;文件事件处理器&#xff0c;单线程的 io多路监听多个socket&#xff0c;据socket事件类型选择对应的处理器&#xff0c;高性能网络通信模型&#xff0c…

企业必备的 Exchange 邮箱管理工具包:STELLAR TOOLKIT FOR EXCHANGE

天津鸿萌科贸发展有限公司是 Stellar 系列软件的授权代理商。 Stellar Toolkit for Exchange 工具包功能特性 将在线和离线EDB转换为PST Stellar Toolkit for Exchange 可以将邮箱从托管 Exchange 和脱机 EDB 导出为 PST 文件格式。该工具允许您根据需要连接单个或多个邮箱。…

操作系统是如何启动的(持续更新中)

以ChCore为例&#xff0c;介绍OS是如何启动的 OS启动时进行硬件初始化工作&#xff0c;并开启页表 进入内核 Bootloader 和 kernel 放在同一个ELF 文件中

【c/c++指针】初学者必看,学好指针的重要性,指针都有哪些应用

指针&#xff0c;在C/C编程中是一个重要且基础的概念。尽管初学者可能会觉得它们有些复杂&#xff0c;但是深入理解和熟练使用指针是每个程序员必须掌握的技能之一。在本文中&#xff0c;我们将探讨学好指针的重要性&#xff0c;以及指针在程序设计中的广泛应用。 1. 内存管理…

vue3实现输入框短信验证码功能---全网始祖

组件功能分析 1.按键删除&#xff0c;清空当前input&#xff0c;并跳转prevInput & 获取焦点,按键delete&#xff0c;清空当前input&#xff0c;并跳转nextInput & 获取焦点。按键Home/End键&#xff0c;焦点跳转first/最后一个input输入框。ArrowLeft/ArrowRight键点击…

SQL语句之VIEW视图和空值

文章目录 一、VIEW视图 1、定义视图 CREATE VIEW 2、删除视图 3、查询视图和更新视图 二、空值 1、判断一个属性是否为空值 2、空值的运算 一、VIEW视图 1、定义视图 CREATE VIEW CREATE VIEW 视图名(列名 1,列名 n) //若省略列名&#xff0c;则该视图由子査询中 SELE…