当前位置: 首页 > news >正文

Spring下载文件

1、controller

/*** 下载文件通过ID** @param auditInformationDTO 靓号稽核文件DTO* @param servletResponse 响应体*/
@GetMapping(value = "/downloadAuditFileByAuditFileId")
public void downloadAuditFileByAuditFileId(@ModelAttribute final GoodNumberAuditInformationDTO auditInformationDTO,final HttpServletResponse servletResponse) throws IOException {final GoodNumberAuditInformation auditInformation = goodNumberAuditManagerService.getAuditInformation(auditInformationDTO);if (Objects.isNull(auditInformation)){throw new DataNotFoundException("文件数据不存在!");}final String attachmentSize = auditInformation.getAttachmentSize();final String attachmentName = auditInformation.getAttachmentName();final String attachmentAddress = auditInformation.getAttachmentAddress();ResponseHeadUtils.setDownloadFileHead(attachmentName, NumberUtils.toInt(attachmentSize), servletResponse);try (final InputStream inputStream = fileOperationStrategy.getObjectInputStream(auditAttachmentBucketName, attachmentAddress)) {IOUtils.copy(inputStream, servletResponse.getOutputStream());} catch (final IOException ioException) {final String fileId = auditInformation.getAuditId();log.error("文件下载异常,出现IO异常,下载文件ID是:{}!", fileId, ioException);throw ioException;}
}

2、ResponseHeadUtils工具类

import com.mocha.order.constant.ContentTypeConstant;
import com.mocha.order.constant.RequestHeadConstant;
import com.mocha.order.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.util.UriUtils;import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;/*** http响应头工具类* 用于设置不通的头部参数** @author yyy*/
@Slf4j
public class ResponseHeadUtils {private ResponseHeadUtils() {}/*** 最小文件大小*/private static final int MIN_FILE_SIZE = 0;/*** 设置响应头的ContentDisposition** @param fileName 文件名称* @param httpServletResponse http响应头* @throws IllegalArgumentException 如果文件名称为空*/public static void setContentDisposition(final String fileName, final HttpServletResponse httpServletResponse) {if (StringUtils.isBlank(fileName)) {log.error("设置响应头ContentDisposition异常:文件名称为空!");throw new IllegalArgumentException("文件名称为空!");}try {final String encodedFileName = UriUtils.encode(fileName, StandardCharsets.UTF_8.toString());httpServletResponse.setHeader(RequestHeadConstant.CONTENT_DISPOSITION,"attachment; filename=" + encodedFileName + ";filename*=UTF-8''" + encodedFileName);} catch (final UnsupportedEncodingException e) {log.error("设置响应头异常:不支持的编码异常!", e);throw new CustomException("不支持的编码异常!");}}/*** 设置下载文件响应头* <p>设置<code>reset()</code>是为了:</p>* <ul>*     <li>确保在设置新的响应头之前,清除任何可能存在的旧的状态或已设置的响应头,以避免因累积设置而产生错误</li>*     <li>避免在执行下载接口之前,拦截器、过滤器等对响应头有个性化的设置,可能导致下载的时候因为响应头设置错误下载异常</li>* </ul>** @param fileName 文件名称* @param fileSize 文件大小* @param httpServletResponse http响应头* @throws IllegalArgumentException 如果文件大小小于等于{@link #MIN_FILE_SIZE}*/public static void setDownloadFileHead(final String fileName, final int fileSize, final HttpServletResponse httpServletResponse) {if (fileSize <= MIN_FILE_SIZE) {log.error("设置响应头ContentLength异常:文件大小为空!");throw new IllegalArgumentException("文件大小为空!");}httpServletResponse.reset();setContentDisposition(fileName, httpServletResponse);httpServletResponse.setContentLength(fileSize);httpServletResponse.setContentType(ContentTypeConstant.APPLICATION_OCTET_STREAM);}
}

3、前端

/downloadFileById?id=' + id

相关文章:

Spring下载文件

1、controller /*** 下载文件通过ID** param auditInformationDTO 靓号稽核文件DTO* param servletResponse 响应体*/ GetMapping(value "/downloadAuditFileByAuditFileId") public void downloadAuditFileByAuditFileId(ModelAttribute final GoodNumberAuditInf…...

如何在数据库中备份表:操作指南与注意事项

在数据库管理中&#xff0c;备份表是一种常见的操作&#xff0c;它可以帮助我们保存数据的当前状态&#xff0c;以便在需要时进行恢复或分析。备份表可以通过创建一个新表并复制原表的所有数据到新表中来实现。 以下是具体的SQL语句&#xff1a; CREATE TABLE backup_table A…...

【数据结构】第八节:链式二叉树

个人主页&#xff1a; NiKo 数据结构专栏&#xff1a; 数据结构与算法 源码获取&#xff1a;Gitee——数据结构 一、二叉树的链式结构 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left; // 左子树根节点struct BinaryT…...

Fair Graph RepresentationLearning via Diverse Mixture-of-Experts

发表于&#xff1a;WWW23 推荐指数&#xff1a; #paper/⭐⭐ 问题背景&#xff1a; 背景 现实世界的数据很多样&#xff0c;阻止GNN学习公平的表示。当去偏见化后&#xff0c;他们面临着可学知识不足且属性有限的重大问题 解决方法&#xff1a; 应对公平训练导致可学习知识…...

电机驱动开发之驱动板

目录 1.主要器件选型2.原理图设计3.PCB绘制电源调理驱动电路电流反馈位置反馈 4.PCB绘制5.打板验证6.总结 1.主要器件选型 器件参数封装理由LDOLM317DCYR &#xff08;24V-12V 12V-5V&#xff09;SOT-223小电流应用 LDO比DCDC噪声小响应快更为稳定预驱FD6288TTssop-20常见无刷…...

STM32F1 HAL库笔记2_HAL 系统驱动程序

1、HAL 固件驱动程序 API 1.1、如何使用此驱动程序 通用 HAL 驱动程序包含一组通用的 API&#xff0c;PPP 外设驱动程序可以使用这些 API 来开始使用 HAL。HAL 包含两个 API 类别&#xff1a; • 常见的 HAL API • 服务 HAL API 1.2、初始化和去初始化函数 本节提供的功能&a…...

el-table实现当内容过多时,el-table显示滚动条,页面不显示滚动条

估计有不少小伙伴在开发公司的ERP使用el-table都会遇到这么一个问题&#xff0c;就是产品经理提出&#xff0c;页面不出现滚动条&#xff0c;因为不美观。但是当el-table内容过多&#xff0c;超过页面的宽度时候&#xff0c;页面就会有滚动条。那应该如何解决呢?能不能让滚动条…...

Java面试篇基础部分-Java中的异常以及异常处理

导语   在实际的开发过程中,往往会遇到各种各样的编程异常,如何处理这些异常,直接会影响到整个程序和系统的稳定性,如果不能在合适的地方抛出合适的异常或者是对异常进行捕获。那么就会影响到整个程序的运行。所以如何处理异常,是作为每个开发者来说必不可少的开发技能。…...

win11 MySQL的坑

最近升级了系统&#xff0c;导致以前的安装的两个版本MySQL服务无法启动&#xff0c;只能在mysql的bin目录&#xff0c;执行mysqld --console才能启动&#xff0c;mysqld都无法启动&#xff0c; 所幸进行了数据库初始化&#xff0c;这次在MySQL的bin目录执行 mysqld或者mysqld …...

stm32单片机个人学习笔记1(简单介绍)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…...

python中@staticmethod、@classmethod用法

1、类的基础介绍 类对象&#xff1a;定义的类就是类对象 类属性&#xff1a;定义在__init__ 外部的变量 类方法&#xff1a;定义在类中&#xff0c;且被classmethod 装饰的方法 实例对象&#xff1a;类对象实例化后就是实例对象 实例属性&#xff1a;定义在__init__内部带…...

Harmony Next 文件命令操作(发送、读取、媒体文件查询)

查询文件位置 hdc shell mediatool query IMG_20240902_204224.jpg 输出示例 拉取文件 hdc file recv /storage/cloud/100/files/Photo/4/IMG_1725281044_036.jpg aa.jpg 发送文件 hdc file send aa.jpg /storage/media/100/local/files/Docs/Download/ab.jpg 下载目录位置…...

Go语言中的链表与双向链表实现

链表基础 链表是一种由有限元素组成的数据结构&#xff0c;其中每个元素至少使用两个内存空间&#xff1a;一个存储实际数据&#xff0c;另一个存储指向下一个元素的指针&#xff0c;从而形成一个元素序列构成链表。链表的第一个元素称为头结点&#xff0c;而最后一个元素通常…...

开始一个WPF项目时的记忆重载入

目前在工业软件的UI开发方案选择中&#xff0c;WPF仍然是一个重要的选项。 但是其固有的复杂性&#xff0c;对于像我这样&#xff0c;并不是一直在从事界面开发的人来说&#xff0c;每次重启&#xff0c;都需要一两天的适应的时间。所以这里稍微写一个笔记。 还是老办法&…...

用go语言实现树和哈希表算法

算法复杂度 判断一个算法的效率通常基于其计算复杂度&#xff0c;这主要与算法访问输入数据的次数有关。计算机科学中常用大O表示法来描述算法的复杂度。例如&#xff0c;O(n)的算法只需访问一次输入数据&#xff0c;因此优于O(n)的算法&#xff0c;后者则优于O(n)的算法&…...

基于SpringBoot+Vue+MySQL的校园健康驿站管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 本文设计并实现了一个基于SpringBoot后端、Vue前端与MySQL数据库的校园健康驿站管理系统。该系统旨在通过数字化手段&#xff0c;全面管理学生的健康信息&#xff0c;包括体温监测、疫苗接种记录、健康状况申报等&#xff0c;为…...

深入理解MATLAB中的事件处理机制

在MATLAB中&#xff0c;事件处理机制是一种强大的工具&#xff0c;它允许对象之间的交互和通信。这种机制基于观察者设计模式&#xff0c;其中一个对象&#xff08;观察者&#xff09;监听另一个对象&#xff08;发布者&#xff09;的状态变化。当发布者的状态发生变化时&#…...

线程--线程同步

这里写目录标题 同步概念线程同步概念数据混乱原因 互斥量原理锁的注意事项1、cpu时间轮片2、建议锁总结 使用锁来管理线程同步问题产生主要函数init、destorylock、unlock代码注意事项&#xff08;锁的粒度&#xff09; try锁死锁出现原因图解 读写锁特性图解函数总览init、de…...

【QT】Qt窗口

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;菜单栏设置&#x1f449;&#x1f3fb;QToolBar练习 &#x1f449;&#x1f3fb;QStausBar&#x1f449;&#x1f3fb;Q…...

场外个股期权怎么给股票加杠杆?

今天期权懂带你了解场外个股期权怎么给股票加杠杆&#xff1f;场外期权交易通过向证券公司支付一定额度的股票期权费&#xff0c;然后买入大额的股票持仓&#xff0c;从而实现的杠杆交易。 买入看涨期权 操作&#xff1a;支付权利金购买看涨期权。 杠杆作用&#xff1a; 期…...

【多模态技术解析】先对齐再融合:动量蒸馏如何重塑视觉与语言表征学习

1. 为什么视觉和语言要先对齐再融合&#xff1f; 想象一下你正在教一个小朋友认识动物。如果先给他看一张猫的图片&#xff0c;再告诉他"这是狗"&#xff0c;小朋友肯定会困惑。这就是典型的模态未对齐问题——视觉信息和语言信息没有正确匹配。在多模态AI领域&#…...

JPom结合Docker实现SpringBoot项目自动化构建与部署实战

1. 为什么你需要JPomDocker自动化部署方案 每次手动打包SpringBoot项目时&#xff0c;你是不是也经历过这样的痛苦&#xff1f;先在本地mvn clean package&#xff0c;然后scp上传到服务器&#xff0c;接着ssh连上去kill旧进程&#xff0c;最后nohup启动新jar包。更可怕的是半夜…...

大模型岗位大盘点!小白也能快速上手的5大方向,速来抄作业!

作者参加春招宣讲会后&#xff0c;对大模型岗位产生兴趣&#xff0c;但因自身条件感到迷茫。文章详细盘点了大模型相关岗位&#xff0c;包括核心算法、应用算法、系统与基建、数据与评测、工程开发、产品与运营六大类&#xff0c;并分析了各岗位的职责与要求。作者建议小白可从…...

一天一个开源项目(第59篇):Dream Recorder - 用 AI 把梦境变成视频的物理设备

引言 “Record your dreams. Wake up. Speak. Watch them come to life.” 这是「一天一个开源项目」系列的第 59 篇文章。今天介绍的项目是 Dream Recorder&#xff08;GitHub&#xff09;。 想把梦境变成可回放的视频&#xff1f;Dream Recorder 是 Modem 开源的物理梦境记录…...

ESP8266轻量协程调度器:零栈LeanTask与确定性多任务设计

1. 项目概述ESP8266Scheduler 是一个专为 ESP8266 平台设计的协作式多任务调度器&#xff08;Co-operative Multitasking Scheduler&#xff09;&#xff0c;其核心目标是在资源受限的 Wi-Fi SoC 上实现轻量、确定、可预测的任务并发执行模型&#xff0c;同时避免传统抢占式 RT…...

小白程序员必看:收藏这份RAG大模型核心技术原理详解,轻松入门智能Agent

1. 核心流程全景图RAG 的生命周期可以严格划分为两个平行的工作流&#xff1a;离线数据处理流&#xff08;Data Pipeline&#xff09; 和 在线检索生成流&#xff08;Query Pipeline&#xff09;。RAG 核心工作流 1.1 离线数据处理流&#xff08;Data Ingestion&#xff09; 这…...

别再只用DoDragDrop了!手把手教你用WPF实现一个能拖拽合并数据的自定义控件(附完整源码)

WPF高级拖拽交互实战&#xff1a;从原生API局限到自定义控件设计 在构建现代桌面应用时&#xff0c;流畅自然的拖拽交互往往能极大提升用户体验。WPF虽然提供了基础的DoDragDrop API&#xff0c;但当我们需要实现复杂场景如卡片合并、动态数据交换时&#xff0c;原生方案就显得…...

树莓派无头模式终极指南:不接显示器,用SSH+VNC搞定所有开发调试

树莓派无头模式终极指南&#xff1a;不接显示器&#xff0c;用SSHVNC搞定所有开发调试 当你把树莓派塞进机器人底盘、挂在墙上作为智能家居中枢&#xff0c;或是藏在机柜里充当服务器时&#xff0c;最不想看到的就是拖着一堆显示器和线材。作为嵌入式开发老手&#xff0c;我经历…...

Pixel Mind Decoder 安全加固指南:防止API滥用与敏感信息泄露

Pixel Mind Decoder 安全加固指南&#xff1a;防止API滥用与敏感信息泄露 1. 为什么API安全如此重要 当你把AI模型部署为公开API服务时&#xff0c;就像在互联网上开了一家24小时营业的商店。如果不做好安全防护&#xff0c;可能会遇到各种不速之客&#xff1a;恶意攻击者试图…...

Python F1数据分析终极指南:5个高级技巧掌握赛车性能可视化

Python F1数据分析终极指南&#xff1a;5个高级技巧掌握赛车性能可视化 【免费下载链接】Fast-F1 FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry 项目地址: https://gitcode.com/GitHub_Trending/fa/Fas…...