Spring Boot实现文件上传和下载

2023-11-15

实现Spring Boot文件上传和下载的步骤:

1.文件上传

  • 在pom.xml文件中添加依赖:spring-boot-starter-webspring-boot-starter-thymeleaf
  • 创建一个上传前端的页面,包括一个表单来选择文件和一个提交按钮。
  • 在Controller中添加一个POST方法,该方法接受MultipartFile参数,将文件保存在服务器上。
  • 在application.properties文件中配置上传文件的最大大小和文件存储路径。

2.文件下载

  • 在Controller中添加一个GET方法,该方法接收一个文件名参数,通过ResponseEntity将文件内容返回给客户端。
  • 如果需要授权访问,则可以通过使用Spring Security实现基本身份验证。

以下是Spring Boot实现文件上传和下载的代码示例:

1.文件上传

  • pom.xml依赖配置:
<!-- 文件上传 -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>

<!-- Servlet API -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>
  • 在配置文件中配置:

    # 开启上传和下载
    spring.servlet.multipart.enabled=true
    # 最大的文件大小
    spring.servlet.multipart.max-file-size=30MB
    # 单次最大请求大小
    spring.servlet.multipart.max-request-size=30MB
    # 自定义的上传文件存放路径
    file.upload.dir=e:/test
    
  • 在Controller中添加一个POST方法:

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return "上传失败,请选择文件";
    }

    // 获取文件名
    String fileName = file.getOriginalFilename();
    // 获取文件的后缀名
    String suffixName = fileName.substring(fileName.lastIndexOf("."));

    // 上传后的路径
    String filePath = "D:/upload/";

    // 解决中文问题,liunx下中文路径,图片显示问题
    fileName = UUID.randomUUID() + suffixName;

    // 构建上传路径
    File dest = new File(filePath + fileName);

    // 检测是否存在目录
    if (!dest.getParentFile().exists()) {
        dest.getParentFile().mkdirs();
    }

    try {
        // 保存文件
        file.transferTo(dest);
        return "上传成功";
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "上传失败";
}

2.文件下载

  • 在Controller中添加一个GET方法:
@GetMapping("/download")
public ResponseEntity<byte[]> download() throws IOException {
    // 获取文件
    File file = new File("D:/upload/1.jpg");

    // 构造响应
    HttpHeaders headers = new HttpHeaders();
    headers.setContentDispositionFormData("attachment", file.getName());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
编写Controller方法
@GetMapping("/download")
public void downloadFile(HttpServletResponse response) {
    try {
        //获取要下载的文件
        File file = new File("file_path");

        //设置响应的内容类型为二进制流,即文件类型
        response.setContentType("application/octet-stream");

        //设置文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));

        //创建输入流
        FileInputStream inputStream = new FileInputStream(file);
        BufferedInputStream buffInputStream = new BufferedInputStream(inputStream);

        //创建输出流
        ServletOutputStream outputStream = response.getOutputStream();
        BufferedOutputStream buffOutputStream = new BufferedOutputStream(outputStream);

        //循环读取数据并写入到响应输出流中
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = buffInputStream.read(buffer)) != -1) {
            buffOutputStream.write(buffer, 0, len);
        }

        //关闭流
        buffOutputStream.flush();
        buffOutputStream.close();
        outputStream.flush();
        outputStream.close();
        buffInputStream.close();
        inputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
SpringBoot中,我们可以通过以下步骤实现文件响应给浏览器实现下载:

在Controller中编写请求处理方法,并使用@GetMapping注解来指定该方法处理GET请求。

在方法中使用InputStreamResource将本地文件以流的形式读取到内存中。

使用ResponseEntity.ok()方法构造响应,并将之前获取到的InputStreamResource作为参数传入。

使用.header()方法设置响应头,包括Content-DispositionContent-Type等信息。

以下是一个示例代码:

import org.springframework.core.io.InputStreamResource;
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 java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@Controller
public class FileDownloadController {
    
    @GetMapping("/download")
    public ResponseEntity<InputStreamResource> downloadFile() throws IOException {
        String filename = "example.txt";
        InputStream is = new FileInputStream(filename);
        InputStreamResource resource = new InputStreamResource(is);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename=\"" + filename + "\"");
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(is.available())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(resource);
    }
}
其中,Content-Disposition头用于描述响应结果的类型,这里指定为attachment表示要下载的文件,filename表示文件名。

Cache-ControlPragmaExpires头用于控制缓存的行为,这里设为不缓存。

最后将InputStreamResource对象作为响应体返回即可。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot实现文件上传和下载 的相关文章

  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 属性文件中的字符串主机名:Java

    这听起来可能是一个非常简单的问题 但我无法找到解决方法 我有一个 config properties 文件 其中包含两个键值 IP 地址和端口号 我读取此配置文件以提取字符串格式的键值 但是 当我尝试使用这些值时 我无法连接到从配置文件中检
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 在 Streamreduce 方法中,求和时恒等式必须始终为 0,乘​​法时恒等式必须始终为 1?

    我继续java 8学习 我发现了一个有趣的行为 让我们看一下代码示例 identity value and accumulator and combiner Integer summaryAge Person getPersons stre
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • Eclipse 在单独的窗口中打开代码

    我正在 eclipse 中编程 在两个显示器设置上运行 在其中一台显示器上 我只获得了项目资源管理器和编辑器作为自定义透视图 而在另一台显示器上 我获得了其他工具 例如控制台 调试 任务 变量 断点等 例如 当我单击任务视图中的任务时 这将
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE

随机推荐

  • 毕业设计-基于机器学习的图片处理图片倾斜校正

    前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大家顺利通过和节省时间
  • 95-36-210-ChannelHandler-系统Channel-TimeoutHandler1

    文章目录 TimeoutHandler TimeoutHandler 在开发TCP服务时 一个常见的需求便是使用心跳保活客户端 而Netty自带的三个超时处理器IdleStateHandler ReadTimeoutHandler和Writ
  • java.lang包介绍

    前言 java lang包是java语言的核心 它提供了java中的基础类 包括基本Object类 Class类 String类 基本类型的包装类 基本的数学类等等最基本的类 我们介绍一下Java 8中的java lang包 主要类如下图
  • Koa2学习之旅----结合 jqPaginator实现列表分页

    1 下载jqPaginator js 放在静态目录里面 2 在需要分页的地方引入jqPaginator js 3 在需要分页的地方加个空div div class pagination div 4 调用插件实例化 page jqPagina
  • Hadoop 2.x与3.x 22点比较:3.x将节省大量存储空间

    问题导读 1 Hadoop3 x通过什么方式来容错 2 Hadoop3 x存储开销减少了多少 3 Hadoop3 x MR API是否兼容hadoop1 x 一 目的 在这篇文章中 我们将讨论Hadoop 2 x与Hadoop 3 x之间的
  • BindIoCompletionCallback多线程下效率不如单线程高.

    BindIoCompletionCallback多线程下效率不如单线程高 2015 02 26 14 13 20 分类 C C IOCP TCPIP Socket Server cpp include stdafx h include Sa
  • 教你使用Python Statsmodel进行假设检验和线性回归

    如果你使用 Python 处理数据 你可能听说过 statsmodel 库 Statsmodels 是一个 Python 模块 它提供各种统计模型和函数来探索 分析和可视化数据 该库广泛用于学术研究 金融和数据科学 在本文中 我们将介绍 s
  • mac mysql忘记root密码解决方法

    通过homebrew方式安装的mysql mysql安装目录为 usr local Cellar mysql 5 7 去bin目录下在管理员权限下以安全方式启动mysql 即可不用密码登录 再修改root密码 具体步骤 cd usr loc
  • 解决vs2017无法安装问题

    解决vs2017无法安装问题 金庆的专栏 2018 11 从官网下载了 vs community 1600125377 1541561546 exe 但是运行安装时无法出现产品选择界面 查看 Temp 目录下的日志 没有发现错误 搜索一下
  • Xshell与Xftp打不开

    去服务里边把flexnet licensing service服务停止掉然后把启动类型改成禁止 看看是不是能打开了 再不行就重启一下 一定要看的干货 链接 除了接私单 写博客 做教程之外 程序员如何利用自身技术 实现躺着赚钱
  • dev express 知乎_开发环境模拟开启HTTPS服务

    主要解决的问题 开发环境中 使用只支持 https 服务的Web API 例如 navigator clipboard 操作系统剪贴板 navigator mediaDevices 访问相机或麦克风等媒体输入设备 等 解决 Cookie 的
  • 服务器 备案 文档,自己的服务器 备案

    自己的服务器 备案 内容精选 换一换 弹性云服务器与传统硬件服务器一样 可以部署任意业务应用 例如 邮件系统 WEB系统 ERP系统等 弹性云服务器创建成功后 您就可以像使用自己的本地PC或物理服务器一样 在云上使用弹性云服务器 云手游服务
  • 移动端自动化测试

    Java和安卓环境安装和配置 安装java JDK 并配置环境变量 1 新建环境变量 JAVA HOME 2 新建环境变量 CLASS PATH JAVA HOME lib dt jar JAVA HOME lib tools jar 注意
  • Maven项目一直运行不出来但又没有报错

    导致原因 1 数据库无法正常连接上 2 注册中心连接不上 3 逆向工程生成的mapper出错 多次生成 解决办法 在无法运行出来的项目中添加log4j文件 再次运行 根据运行结果进行修改
  • 安装Android Studio2020.3.1.26 和 过程中遇到的各种问题

    学习视频 https www bilibili com video BV1Jb4y187C4 安装Android Studio 官网 安装地址 https developer android google cn studio 翻到最下面 有
  • C语言函数指针几个应用场景

    点击蓝字 关注我们 因公众号更改推送规则 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 侵删 函数指针是一种非常强大的编程工具 它可以让我们以更加灵活的方式编写程序 在本文中 我们将介绍 6 个函数指针的高级应用场景 并贴出
  • 删除闭包

    var foo function var n 0 return add function return n
  • mySQL (关系型数据库管理系统)

    MySQL是一个关系型数据库管理系统 由瑞典MySQL AB 公司开发 目前属于 Oracle 旗下产品 MySQL 是最流行的关系型数据库管理系统之一 在 WEB 应用方面 MySQL是最好的 RDBMS Relational Datab
  • 用C语言完整实现12种排序方法

    1 冒泡排序 思路 比较相邻的两个数字 如果前一个数字大 那么就交换两个数字 直到有序 时间复杂度 O n 2 稳定性 这是一种稳定的算法 代码实现 void bubble sort int arr size t len size t i
  • Spring Boot实现文件上传和下载

    实现Spring Boot文件上传和下载的步骤 1 文件上传 在pom xml文件中添加依赖 spring boot starter web和spring boot starter thymeleaf 创建一个上传前端的页面 包括一个表单来