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

文章目录

    • 一、原理分析
      • 1.1 请求类型
      • 1.2 服务器解析
    • 二、功能实现
      • 2.1 创建项目并导入依赖
      • 2.2 文件上传功能实现
        • 2.2.1 文件上传 Service
        • 2.2.2 文件上传 Controller
      • 2.3 文件下载功能实现
        • 2.3.1 文件下载 Service
        • 2.3.2 文件下载 Controller
      • 2.4 文件上传前端代码(可选)
        • 2.4.1 上传文件的 HTML 表单
        • 2.4.2 访问前端页面
    • 三、功能测试
      • 3.1 测试文件上传
      • 3.2 测试文件下载
    • 参考资料

完整案例代码:java-demos/spring-boot-demos/spring-boot-file at main · idealzouhu/java-demos (github.com)

一、原理分析

1.1 请求类型

文件上传通常使用 multipart/form-data 类型的 POST 请求。

  • multipart/form-data:用于在表单提交时上传文件的 MIME 类型。它允许将文件和其他表单字段组合在一起发送,服务器能识别出每个部分并提取出文件。

文件下载则只是简单的 GET 请求。在 Spring MVC 中,返回对象通常是 ResponseEntity 或者 HttpServletResponse 对象。

1.2 服务器解析

现有的 Web 框架都内置了处理文件上传的功能。在 Spring MVC 中, MultipartFile 是用来表示上传的文件,服务器会自动解析该文件并进行处理。

MultipartFile 的常用方法有:

  • getName():获取文件在服务器上的文件名,可能已经被服务器修改。
  • getOriginalFilename():获取文件在客户端上的原始文件名,没有被服务器修改。
  • getContentType():获取文件的内容类型。
  • isEmpty():判断文件是否为空。
  • getSize():获取文件大小(字节)。
  • getBytes():读取文件内容为字节数组。
  • getInputStream():获取文件内容的输入流。
  • getResource():将文件转换为资源对象。
  • transferTo(File dest):将文件内容传输到指定的目标文件。
  • transferTo(Path dest):将文件内容传输到指定的目标路径

二、功能实现

2.1 创建项目并导入依赖

在 start.springboot.io 创建项目,导入以下依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2 文件上传功能实现

将文件上传的具体逻辑抽象到一个 FileService 中,让 Controller 调用该服务处理上传请求。

2.2.1 文件上传 Service
@Service
public class FileService {/*** 上传文件** @param file* @return*/public String uploadFile(MultipartFile file) {// 检查文件是否为空if (file.isEmpty()) {return "上传失败,因为文件是空的。";}// 获取文件名和保存路径String fileName = file.getOriginalFilename();String filePath = "C:/uploads/"; // 自定义文件保存路径File dest = new File(filePath + fileName);// 确保目录存在if (!dest.getParentFile().exists()) {dest.getParentFile().mkdirs();}// 保存文件try {file.transferTo(dest);return "文件上传成功:" + fileName;} catch (IOException e) {e.printStackTrace();return "文件上传失败。";}}
}
2.2.2 文件上传 Controller
@RequiredArgsConstructor
@RestController
public class FileUploadController {private final FileService fileService;/*** 上传文件自动绑定到 MultipartFile 对象中** @param file 上传文件* @return*/@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {return fileService.uploadFile(file);}
}

2.3 文件下载功能实现

将文件上传的具体逻辑抽象到一个 FileService 中,让 Controller 调用该服务处理上传请求。

2.3.1 文件下载 Service
@Service
public class FileService {/*** 下载文件** 根据文件名构建文件路径,并检查文件是否存在如果文件不存在,则返回404未找到的响应* 如果文件存在,将文件作为资源包装,并设置HTTP响应头以提示浏览器下载文件** @param fileName 要下载的文件名* @return 包含文件资源的响应实体,如果文件不存在则为404响应*/public ResponseEntity<Resource> downloadFile(String fileName) {// 构建文件路径String filePath = "C:/uploads/" + fileName;File file = new File(filePath);// 检查文件是否存在if (!file.exists()) {// 文件不存在,返回404未找到return ResponseEntity.notFound().build();}// 将文件包装为资源Resource resource = new FileSystemResource(file);// 创建HTTP响应头,用于指定文件下载HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");// 返回包含文件资源和响应头的响应实体return ResponseEntity.ok().headers(headers).body(resource);}
}
2.3.2 文件下载 Controller
@RequiredArgsConstructor
@RestController
public class FileDownloadController {private final FileService fileService;@GetMapping("/download")public ResponseEntity<Resource> downloadFile(@RequestParam String fileName) {return fileService.downloadFile(fileName);}
}

2.4 文件上传前端代码(可选)

该部分代码为 [2.2 文件上传功能实现](###2.2 文件上传功能实现) 的前端实现。

2.4.1 上传文件的 HTML 表单

创建 upload.html 文件,放在 src/main/resources/static 目录下。

<!DOCTYPE html>
<html>
<head><title>File Upload</title>
</head>
<body><h2>Upload a file</h2><form id="uploadForm"><label for="file">Choose file to upload:</label><input type="file" id="file" name="file" required /><br><br><button type="submit">Upload</button>
</form><script>document.getElementById('uploadForm').addEventListener('submit', function(event) {event.preventDefault();  // 防止表单的默认提交行为const fileInput = document.getElementById('file');const formData = new FormData();formData.append('file', fileInput.files[0]);// 使用 Fetch API 发送文件到后端fetch('/upload', {method: 'POST',body: formData}).then(response => response.text()).then(data => alert('File uploaded successfully: ' + data)).catch(error => console.error('Error uploading file:', error));});
</script></body>
</html>

其中,表单中 name="file" 指定了文件在请求体中的键,后端服务器将通过这个名称来获取文件数据。

2.4.2 访问前端页面

进入前端页面的 URL 为 http://localhost:8080/upload.html

在这里插入图片描述

三、功能测试

3.1 测试文件上传

使用 Postman 发送 POST 请求到 /upload,并选择一个文件进行上传。示例 URL 为

http://localhost:8080/upload

在这里插入图片描述

3.2 测试文件下载

使用 Postman 或 HTML 表单发送 POST 请求,下载指定的文件。

示例 URL 为 http://localhost:8080/download?fileName=demo.txt

在这里插入图片描述

参考资料

Java实战:Spring Boot 实现文件上传下载功能_springboot 文件下载-CSDN博客

Spring Boot文件上传与下载讲解与实战(超详细 附源码)-阿里云开发者社区 (aliyun.com)

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

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

相关文章

HarmonyOS Next API12最新版 端云一体化开发-云函数篇

一、新建一个端云一体化项目 见文章&#xff1a; HarmonyOS NEXT API12最新版 端云一体化开发-创建端云一体化项目流程_鸿蒙appapi-CSDN博客 二、官方文档 使用限制-云函数 - 华为HarmonyOS开发者 (huawei.com) Cloud Foundation Kit简介-Cloud Foundation Kit&#xff0…

深度学习:SGD的缺点

首先看下述函数&#xff1a; 最小值为x0&#xff0c;y0处 先了解下它的梯度特征。了理解其梯度特征&#xff0c;我们需要计算其梯度向量。 梯度向量 ∇f 是函数 f 在每个变量方向上的偏导数组成的向量。具体来说&#xff1a; ∇f(∂f/∂x,∂f∂/y) 首先&#xff0c;我们计算 f …

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

Qt | windows视频播放器小项目

点击上方"蓝字"关注我们 01、前言 >>> Windows平台如果播放不了视频,记得下载编解码工具:https://www.mediaplayercodecpack.com/#google_vignette media.player.codec.pack.v4.6.0.setup.exe 下载后双击安装。 02、videowidget.pro >>> (.pro…

Android Activity SingleTop启动模式使用场景

通知栏 当用户点击通知栏中的通知时,可以使用单顶启动模式来打开对应的活动,并确保只有一个实例存在。 简单集成极光推送 创建应用 获取appkey参数 切换到极光工作台 极光sdk集成 Project 根目录的主 gradle 配置 Module 的 gradle 配置 Jpush依赖配置 配置推送必须…

ssm基于vue框架和elementui组件的手机官网+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框…

【Android】perfetto使用学习

在开发者选项中的系统跟踪里抓取的perfetto文件是保存在/data/local/traces 里的 adb pull /data/local/traces ./ 主线程中的执行是受vsync信号控制的&#xff0c;即间隔调用的 如果写一个while线程&#xff0c;一直使用cpu&#xff0c;是怎样的呢&#xff0c;这里我们来试验一…

技术周总结 10.21~10.27周日

文章目录 一、10.24 周四 程序员节2.1&#xff09;问题01&#xff1a; Memory Analysis Tool的使用方法 二、10.27 周日2.1&#xff09; J2EE架构J2EE 的核心组件与技术J2EE 的多层架构J2EE 的优缺点J2EE 的应用场景 2.2&#xff09;web应用开发中的 "web服务器" 和 …

探讨Facebook的AI研究:未来社交平台的技术前瞻

在数字时代&#xff0c;社交媒体已成为人们日常生活的重要组成部分。作为全球最大的社交网络之一&#xff0c;Facebook不断致力于人工智能&#xff08;AI&#xff09;的研究与应用&#xff0c;以提升用户体验、增强平台功能并推动技术创新。本文将探讨Facebook在AI领域的研究方…

国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播

在当今社会&#xff0c;视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而&#xff0c;由于不同厂家和平台之间的兼容性问题&#xff0c;视频监控系统的联网和整合面临巨大挑战。为了解决这个问题&#xff0c;国家制定了《公共安全视频监控联网系…

【网络面试篇】三次握⼿、四次挥手综述

目录 一、三次握手 1. 过程描述 2. 为什么不是四次握手&#xff1f;为什么不能两次握手&#xff1f; 二、四次挥手 1. 过程描述 2. 为什么是四次挥手&#xff1f; 一、三次握手 1. 过程描述 ① 客户端 向 服务器 发送 SYN 报文、初始化序列号 ISN&#xff08;seqx&…

JavaSet集合

无序&#xff08;指的是添加顺序和获取出的数据顺序不一致&#xff0c;不重复&#xff0c;无索引 既然Set没有索引&#xff0c;因此功能同上一篇Connection的功能&#xff0c;几乎没有额外的功能 HashSet的原理 为什么是无序&#xff08;要构建红黑树&#xff09;&#xff0…

【测试平台】Odin-ws 工程环境部署

背景&#xff1a; 这个是我4年半以前接受测试平台过程中遇到问题记录&#xff0c;因为交接成都这边&#xff0c;拿出来直接用了。这里做个记录。 一、美东测试服务器相关 1.主服务器部署机器 该机器是美东服务器。 机器配置&#xff1a;t5.xlarge cpu 4核&#xff0c; 内存…

Android Junit 单元测试 | 依赖配置和编译报错解决

问题 为什么在依赖中添加了testImplement在build APK的时候还是会报错&#xff1f;是因为没有识别到test文件夹是test源代码路径吗&#xff1f; 最常见的配置有: implementation - 所有源代码集(包括test源代码集)中都有该依赖库.testImplementation - 依赖关系仅在test源代码…

如何将png格式的图片做成序列帧

类似以上的图片&#xff0c;根据图片的总长度和图片总数进行计算 <div class"frogeggitem"></div>.frogeggitem {width: 900rpx;height: 1000rpx;background: url(https://frog-skin.haoxgame.com/status2/frog/frogegg.png)no-repeat;background-size:…

学习笔记——动态路由——OSPF(距离矢量协议)OSPF路由类型

OSPF路由类型 在OSPF中&#xff0c;路由类型指的是不同种类的路由&#xff0c;用于描述网络中不同的路由信息及其传输方式。 1、Intra Area路由(区域内路由) Intra Area路由(区域内路由/本地路由/内部路由)是OSPF协议中的一种路由类型&#xff0c;用于描述在同一个OSPF区域内…

Android Studio Dolphin 下载、安装与配置教程

文章目录 Android Studio Dolphin简介一、核心特性二、新增功能三、用户体验优化 一&#xff0c;下载百度网盘迅雷云盘 二&#xff0c;安装三&#xff0c;下载组件四&#xff0c;添加SDK五&#xff0c;创建项目六&#xff0c;安装 Device模拟器运行项目 Android Studio Dolphin…

磁盘分区工具 DiskGenius Pro v5.5.0.1488 中文汉化版

DiskGenius 是一款专家级数据恢复软件&#xff0c;集数据恢复、硬盘分区、系统备份还原等多种功能于一身的超级工具软件&#xff0c;功能全面&#xff0c;安全可靠。可以提供磁盘的数据找回、备份、分区、修复、删除、格式化等操作&#xff0c;也能帮助用户修复磁盘坏道、彻底删…

《一人公司:失业潮中的高新技术工作者》读书笔记

基本信息 书名&#xff1a;一人公司&#xff1a;失业潮中的高新技术工作者作者&#xff1a;[美]卡丽莱恩&#xff08;Carrie M. Lane&#xff09;出版社&#xff1a;广东人民出版社出版时间&#xff1a;2023年11月 内容简介 本书通过18个月的田野调查和9年的跟踪寻访&#…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…