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

Java从resources文件下载文档,文档没有后缀名

业务场景:因为公司会对excel文档加密,通过svn或者git上传代码也会对文档进行加密,所以这里将文档后缀去了,这样避免文档加密。

实现思路:将文档去掉后缀,放入resources下,获取输入流,最后加上后缀,前端成功下载

效果图

请添加图片描述


请添加图片描述

上代码

package com.***.util;import cn.hutool.core.util.StrUtil;
import org.springframework.core.io.ClassPathResource;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;/*** @author longwei* @Description excel帮助类* @date 2023/8/30 14:36*/
public class ExcelUtils {/*** 从静态资源下载文件** @param fileName 文件名,没有后缀* @param suffix   文件后缀* @param request  request* @param response response*/public static void downloadFileByLocalPath(HttpServletRequest request, HttpServletResponse response,String fileName, String suffix) throws Exception {if (StrUtil.isEmpty(fileName) || StrUtil.isEmpty(suffix)) {throw new RuntimeException("文件信息不能为空");}InputStream inputStream = new ClassPathResource("file" + File.separator + fileName).getInputStream();fileName = fileName + suffix;downFileByInputStream(request, response, inputStream, fileName);}public static void downFileByInputStream(HttpServletRequest request, HttpServletResponse response, InputStream inputStream, String fileName) throws Exception {byte[] buffer = new byte[1024];BufferedInputStream bis = null;OutputStream os = null;String finalFileName;try {final String userAgent = request.getHeader("USER-AGENT");//IE浏览器if (StrUtil.contains(userAgent, "MSIE") || StrUtil.contains(userAgent, "Trident")) {finalFileName = URLEncoder.encode(fileName, "UTF8");}//google,火狐浏览器else if (StrUtil.contains(userAgent, "Mozilla")) {finalFileName = new String(fileName.getBytes(), "ISO8859-1");}//其他浏览器else {finalFileName = URLEncoder.encode(fileName, "UTF8");}response.setCharacterEncoding("UTF-8");// 设置强制下载不打开response.setContentType("application/force-download");// 设置文件名response.addHeader("Content-Disposition", "attachment;fileName=" + finalFileName);bis = new BufferedInputStream(inputStream);os = response.getOutputStream();int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (Exception e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (Exception e) {e.printStackTrace();}}if (bis != null) {try {bis.close();} catch (Exception e) {e.printStackTrace();}}if (os != null) {try {os.flush();os.close();} catch (Exception e) {e.printStackTrace();}}}}}

controller层

    @RequestMapping("/downloadTemplate")public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {breedInfoService.downloadTemplate(request, response);}

service.impl层,这里直接用ExcelUtils方法

	@Overridepublic void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {String fileName = "中药饮片导入模板";try {ExcelUtils.downloadFileByLocalPath(request, response, fileName, ".xlsx");} catch (Exception e) {log.error("下载中药饮片导入模板失败-{}", e.getMessage());throw new BusinessException("下载中药饮片导入模板失败,请联系管理员!");}}

相关文章:

Java从resources文件下载文档,文档没有后缀名

业务场景:因为公司会对excel文档加密,通过svn或者git上传代码也会对文档进行加密,所以这里将文档后缀去了,这样避免文档加密。 实现思路:将文档去掉后缀,放入resources下,获取输入流&#xff0…...

【动手学深度学习-Pytorch版】BERT预测系列——BERTModel

本小节主要实现了以下几部分内容: 从一个句子中提取BERT输入序列以及相对的segments段落索引(因为BERT支持输入两个句子)BERT使用的是Transformer的Encoder部分,所以需要需要使用Encoder进行前向传播:输出的特征等于词…...

Python之元组、字典和集合练习

1、餐厅下午茶 (列表与元组 crr66) 某餐厅推出了优惠下午茶套餐活动。顾客可以以优惠的价格从给定的糕点和给定的饮 料中各选一款组成套餐。已知,指定的糕点包括松饼(Muffins)、提拉米苏(Tiramisu)、芝士蛋 糕(Cheese Cake)和三明治(Sandwic…...

【数据结构】归并排序和计数排序(排序的总结)

目录 一,归并排序的递归 二,归并排序的非递归 三,计数排序 四,排序算法的综合分析 一,归并排序的递归 基本思想: 归并采用的是分治思想,是分治法的一个经典的运用。该算法先将原数据进行拆…...

某医疗机构:建立S-SDLC安全开发流程,保障医疗前沿科技应用高质量发展

某医疗机构是头部资本集团旗下专注大健康领域战略性投资与运营的实业公司,市场规模超300亿。该医疗机构已完成数字赋能,形成了标准化、专业化、数字化的疾病和健康管理体系,将进一步规划战略方向,为人工智能纳米技术、高温超导、生…...

验证二叉搜索树的后序遍历序列

LCR 152. 验证二叉搜索树的后序遍历序列 class VerifyTreeOrder:"""LCR 152. 验证二叉搜索树的后序遍历序列https://leetcode.cn/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/description/"""def solution(self, postorder: Lis…...

第三章 内存管理 一、内存的基础知识

目录 一、什么是内存 二、有何作用 三、常用数量单位 四、指令的工作原理 五、装入方式 1、绝对装入 2、可重定位装入(静态重定位) 3、动态运行时装入(动态重定位) 六、从写程序到程序运行 七、链接的三种方式 1、静态…...

【Java学习之道】Java常用集合框架

引言 在Java中,集合框架是一个非常重要的概念。它提供了一种方式,让你可以方便地存储和操作数据。Java中的集合框架包括各种集合类和接口,这些类和接口提供了不同的功能和特性。通过学习和掌握Java的集合框架,你可以更好地管理和…...

logicFlow 流程图编辑工具使用及开源地址

一、工具介绍 LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow 支持前端研发自定义开发各种逻辑编排场景,如流程图、ER 图、BPMN 流程等。在工作审批配置、机器人逻辑编排、无…...

ATF(TF-A)/OPTEE之动态代码分析汇总

安全之安全(security)博客目录导读 1、ASAN(AddressSanitizer)地址消毒动态代码分析 2、ATF(TF-A)之UBSAN动态代码分析 3、OPTEE之KASAN地址消毒动态代码分析...

10-11 周三 shell xargs tr curl 做大事情

最近发现,shell的小工具非常的强大,简单记录下 tr命令 -d 删除字符串1中所有输入字符。-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串 -d 用于删除查询到的字符串中的空格。 [test3NH-DC-NM1…...

1.1 向量与线性组合

一、向量的基础知识 两个独立的数字 v 1 v_1 v1​ 和 v 2 v_2 v2​,将它们配对可以产生一个二维向量 v \boldsymbol{v} v: 列向量 v v [ v 1 v 2 ] v 1 v 的第一个分量 v 2 v 的第二个分量 \textbf{列向量}\,\boldsymbol v\kern 10pt\boldsymbol …...

django: You may need to add ‘localhost‘ to ALLOWED_HOSTS

参考:https://blog.csdn.net/qq_21744873/article/details/87857279 python manage.py runserver后页面访问失败,提示: DisallowedHost at /admin/ Invalid HTTP_HOST header: ‘localhost:8000’. You may need to add ‘localhost’ to ALLOWED_HOSTS…...

网络安全(黑客技术)—自学手册

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...

【Vue】之Vuex的入门使用,取值,修改值,同异步请求处理---保姆级别教学

一,Vuex入门 1.1 什么是Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理库。它用于管理应用程序中的共享状态,它采用集中式存储管理应用的所有组件的状态,使得状态的管理变得简单和可预测 官方解释:Vuex 是一个专为 Vue.js 应…...

ubuntu20.04 nerf Instant-ngp (下) 复现,自建数据集,导出mesh

参考链接 Ubuntu20.04复现instant-ngp,自建数据集,导出mesh_XINYU W的博客-CSDN博客 GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more youtube上的一个博主自建数据集 https://www.youtube.com/watch…...

【常见错误】SVN提交项目时,出现了这样的提示:“XXX“ is scheduled for addition, but is missing。

SVN提交项目时,出现了这样的提示:“XXX“ is scheduled for addition, but is missing。 原因是:之前用SVN提交过的文件/文件夹,被标记为"addition"状态,等待被加入到仓库。虽然你把这个文件删除了&#xf…...

深度学习基础知识 给模型的不同层 设置不同学习率

深度学习基础知识 给模型的不同层 设置不同学习率 1、使用预训练模型时,可能需要将2、学习率设置方式: 1、使用预训练模型时,可能需要将 (1)预训练好的 backbone 的 参数学习率设置为较小值, (2…...

【Python 零基础入门】 Numpy

【Python 零基础入门】第六课 Numpy 概述什么是 Numpy?Numpy 与 Python 数组的区别并发 vs 并行单线程 vs 多线程GILNumpy 在数据科学中的重要性 Numpy 安装Anaconda导包 ndarraynp.array 创建数组属性np.zeros 创建np.ones 创建 数组的切片和索引基本索引切片操作数组运算 常…...

1600*C. Circle of Monsters(贪心)

Problem - 1334C - Codeforces 解析: 对于某个怪兽,他的耗费为两种情况,要么直接用子弹打,要么被前面的怪兽炸,显然第二种情况耗费更少。 统计出所有怪兽的 max(0,a[ i ] - b[ i - 1 ]&#xff…...

GHelper开源工具深度评测:如何为华硕笔记本实现轻量化硬件控制

GHelper开源工具深度评测:如何为华硕笔记本实现轻量化硬件控制 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

LazyVim终极指南:5分钟打造高效Neovim开发环境

LazyVim终极指南:5分钟打造高效Neovim开发环境 【免费下载链接】LazyVim Neovim懒人配置。 项目地址: https://gitcode.com/GitHub_Trending/la/LazyVim LazyVim是一个基于💤 lazy.nvim的Neovim懒人配置方案,专为希望快速搭建专业开发…...

如何用Pollinations.ai在5分钟内创建专业级AI艺术作品

如何用Pollinations.ai在5分钟内创建专业级AI艺术作品 【免费下载链接】pollinations Generate Art 项目地址: https://gitcode.com/gh_mirrors/po/pollinations Pollinations.ai是一款强大的开源AI艺术生成工具,能让你在短短5分钟内从零开始创建令人惊叹的专…...

RVC语音训练实战:从零开始3分钟极速训练模型,打造你的专属AI歌手

RVC语音训练实战:从零开始3分钟极速训练模型,打造你的专属AI歌手 1. RVC简介与准备工作 RVC(Retrieval-based-Voice-Conversion)是一款强大的AI语音转换工具,能够让你快速训练出专属的AI歌手模型。与传统语音合成技术…...

Windows包管理器Winget一键安装完整指南:告别繁琐手动配置

Windows包管理器Winget一键安装完整指南:告别繁琐手动配置 【免费下载链接】winget-install Install winget tool using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2022. 项目地址: https://gitcode.com/gh_mirrors…...

三步搞定图片文字提取:Umi-OCR免费离线OCR工具全攻略

三步搞定图片文字提取:Umi-OCR免费离线OCR工具全攻略 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHu…...

从FAST_LIO到Livox HAP:ROS驱动版本升级中的消息适配实战

1. 当FAST_LIO遇上Livox HAP:问题诊断与场景分析 最近在实验室部署Livox HAP雷达时遇到了一个典型的技术断层问题:最新采购的HAP雷达只支持livox_ros_driver2驱动,而团队长期使用的FAST_LIO算法仍然依赖旧版livox_ros_driver。这就像给最新款…...

如何用GPT-3.5的function calling功能对接理杏仁API获取金融数据(附完整代码)

金融数据智能对接实战:基于GPT-3.5函数调用与理杏仁API的深度整合 在金融科技领域,数据获取与处理的自动化一直是开发者关注的焦点。传统API对接往往需要编写大量固定逻辑的代码,而大语言模型的出现为这一流程带来了新的可能性。本文将深入探…...

Windows 10下ISE14.7与Modelsim 10.1c联合安装避坑指南(附完整破解流程)

Windows 10下ISE14.7与Modelsim 10.1c联合安装全流程解析 对于FPGA开发者而言,一套稳定的EDA环境是高效工作的基础。本文将详细介绍如何在Windows 10 64位系统中完成ISE Design Suite 14.7与Modelsim SE 10.1c的联合安装配置,特别针对安装过程中可能遇到…...

松江少儿英语口碑好的?

松江少儿英语口碑好的 环球乐学少儿英语,指出幼儿英语学习三大痛点: 1. 兴趣不足易抵触:教学形式枯燥,多以机械记单词、跟读为主,不符合幼儿认知特点,易产生厌学情绪。 2. 缺语境不会运用&#xff1a…...