下载项目路径下的文件

news2024/11/25 0:58:33

文件下载(比如模板下载),方法之一是先在服务器上创建一个路径,再通过代码里面写死或配置去读取这个路径的下的这个文件进行下载。 这个方法的缺点就是需要提前创建好这个目录,并给文件路径给与读写权限,上线时还有可能忘记做这个操作了。今天主要是写一个把文件放在项目里面,打包后运行可直接可以下载的功能。

项目录结构
在这里插入图片描述

下载控制类

package com.yulisao.rest;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.walmart.presale_server.util.FileUtil;
import com.walmart.presale_server.util.MyStringUtils;

@RestController
@RequestMapping("/api")
public class FileDownloadRest {

	private static final Logger LOG = LoggerFactory.getLogger(FileDownloadRest.class);

	@GetMapping("dowmTemplate/{name}")
	public Object downLoadExcel(@PathVariable("name") String fileName,HttpServletRequest request) {
		
		ResponseEntity<InputStreamResource> response = null;
        try {
        	String userAgent = request.getHeader("USER-AGENT"); // 获取请求头里的参数
        	String newFileName = FileUtil.getNewFileName(userAgent,fileName);
            response = FileUtil.downloadFile(fileName+".xlsx",newFileName);
        } catch (Exception e) {
        	LOG.error("下载模板失败");
        }
        return response;
	}
}

下载工具类

package com.yulisao.util;

import java.io.*;
import java.net.URLEncoder;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

public class FileUtil {
	
	private static final Logger log = LoggerFactory.getLogger(FileUtil.class);

	/**
	 * 下载模板
	 * @param fileName 模板文件名称或者编号标识
	 * @param newFileName 下载后模板新文件名称
	 * @return
	 */
	 public static ResponseEntity<InputStreamResource> downloadFile(String fileName, String newFileName) {
		 String route = "excel" + File.separator;
		 String path = null;
		 ResponseEntity<InputStreamResource> response = null;
		 try {
			 path = route + fileName;
			 ClassPathResource classPathResource = new ClassPathResource(path);
			 InputStream inputStream = classPathResource.getInputStream();

			 HttpHeaders headers = new HttpHeaders();
			 headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
			 headers.add("Content-Disposition",
					 "attachment; filename=" + newFileName + ".xlsx");
			 headers.add("Pragma", "no-cache");
			 headers.add("Expires", "0");
			 response = ResponseEntity.ok().headers(headers)
					 .contentType(MediaType.parseMediaType("application/octet-stream"))
					 .body(new InputStreamResource(inputStream));
		 } catch (FileNotFoundException e1) {
			 log.error("找不到指定的文件", e1);
		 } catch (IOException e) {
			 log.error("获取不到文件流", e);
		 }
		 return response;
	 }

	/**
	 * 浏览器传参 转码
	 * @param userAgent
	 * @param fileName
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	 public static String getNewFileName(String userAgent, String fileName) throws UnsupportedEncodingException {
		String newFileName = "模板";
		switch (fileName) {
			case "template-1" :
				newFileName = "用户批量导入模板";
				break;
			case "template-2" :
				newFileName = "用户资金导入模板";
				break;
			default:
				newFileName = "模板";
		}

		// 以免新文件名称编码到浏览器后变成乱码
		if (userAgent != null && userAgent.indexOf("chore") >= 0) {
			newFileName = new String(fileName.getBytes("UTF-8"), "ISO859-1");
		} else {
			newFileName= URLEncoder.encode(fileName,"UTF-8"); //其他浏览器
		}

		return newFileName;
	 }
}

通过baseurl + /api/dowmTemplate/template-2 就可以下载一个名为 用户资金导入模板.xlsx的文件

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

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

相关文章

助力养殖行业数字化转型,基于深度学习模型开发构建猪脸识别系统

养殖行业的数字化进程在国内还是比较缓慢的&#xff0c;一些大厂在前面的一些探索时期做过一些相关的工作&#xff0c;但是受限于各种因素并没有能够广泛地铺展开来&#xff0c;数字化不应该被理解为非常高大上的遥不可及的东西&#xff0c;数字化也不应该成为中低产的一道鸿沟…

AnsibleFATE部署过程

前言 基本上按照官方文档就行了&#xff0c;先做before deploy&#xff0c;再做three side guide.md。 以下是可能出现的问题 这个AnsibleUndefinedVariable: ‘ansible_ssh_host‘ is undefined.是肯定会遇到的&#xff0c;参考我这篇 安全性限制 ansible提示 warning&…

java单例的几种实现方式

单例模式 1.饿汉式&#xff08;线程安全&#xff09;2.懒汉式&#xff08;线程不安全&#xff09;3.懒汉式(线程安全)4. 双重校验5. 静态内部类6. 反射对于单例的破坏7. 序列化对于单例的破坏8.枚举(推荐方式) 1.饿汉式&#xff08;线程安全&#xff09; 在类加载期间初始化静…

写SAE评测,获 Airpods 2大奖【集结令】!

Serverless 应用引擎 SAE 开启测评有奖&#xff01;名额有限&#xff0c;先到先得&#x1f3c6;&#xff01; Serverless应用引擎SAE是一款极简易用、自适应弹性的容器化应用平台。现面向所有用户发出诚挚邀请&#xff0c;参与一分钟部署在线游戏&#xff0c;写下宝贵评测反馈。…

【操作系统笔记七】进程和线程

进程的组成 进程要读取 ELF 文件&#xff0c;那么&#xff1a; ① 要知道文件系统的信息&#xff0c;fs_struct② 要知道打开的文件的信息&#xff0c;files_struct 一个进程除了需要读取 ELF 文件外&#xff0c;还可以读取其他的文件中的数据。 进程中肯定有一个 mm_struct…

华为云云耀云服务器L实例评测|如何保障华为云云耀云服务器L实例的安全和性能

引言 云耀云服务器L实例是华为云提供的高性能计算实例&#xff0c;为用户提供稳定可靠的云计算环境。为了保障实例的安全和性能&#xff0c;用户可以通过设置防火墙和安全组策略来限制网络访问和防止恶意攻击。华为云提供了灵活的管理工具&#xff0c;用户可以通过控制台、API…

【AD】【规则设置】【pcb】默认规则设置

默认规则设置 PCB画板规则的设置1. 间距规则2. 线宽规则3. 过孔规则设置方法盖油的效果&#xff08;左侧&#xff09;过孔的外径盖油 - 8mil 【负片层】过孔的外径盖油 - 8mil 【正片层&#xff08;信号走线层&#xff09;】 【tip】焊盘形状的选取 4.铺铜高级设置&#xff0c;…

快速排序代码及时间空间复杂度

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它的平均时间复杂度为 O(n log n)&#xff0c;是许多排序算法中性能最好的之一。下面是快速排序的代码示例和时间空间复杂度分析&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#x…

计算机网络相关知识点(二)

TCP如何保证传输过程的可靠性&#xff1f; 校验和&#xff1a;发送方在发送数据之前计算校验和&#xff0c;接收方收到数据之后同样需要计算&#xff0c;如果不一致&#xff0c;那么代表传输有问题。 确认应答序&#xff0c;序列号&#xff1a;TCP进行传输时数据都进行了编号…

安全测试 —— Jmeter 登录接口密码 - rsa加密

1、出于安全考虑&#xff0c;有的网站在登陆时为了防止用户在登录时账户密码泄漏&#xff0c;会使用各种加密&#xff0c;给登录的账户密码加密。 比如&#xff1a;明文保存&#xff0c;对称加密算法&#xff0c;MD5、SHA1等单向HASH算法&#xff0c;RSA算法&#xff0c;加密F…

高校为何购买数据库的重要性

随着信息时代的到来&#xff0c;数据库已经成为人们获取信息的重要来源之一。高校作为学术研究的重要机构&#xff0c;对于数据库的需求也越来越大。但是&#xff0c;为什么高校要购买数据库呢&#xff1f;本文将从以下几个方面阐述高校购买数据库的重要性。 一、数据的重要性 …

【Linux】线程同步与互斥

文章目录 &#x1f4d6; 前言1. 线程互斥1.1 临界资源&#xff1a;1.2 互斥性与原子性&#xff1a;1.2 - 1 概念回顾 1.3 线程安全&#xff1a;1.3 - 1 可重入与不可重入 1.4 线程加锁与解锁&#xff1a;1.4 - 1 竞争锁1.4 - 2 锁的原子性 1.5 加锁的原子性如何实现&#xff1a…

丢失d3dcompiler 47.dll的修复方案,哪个更值得推荐

d3dcompiler 47.dll 是 DirectX 中的一部分&#xff0c;它负责实现硬件加速的图形渲染。当我们运行一些需要 DirectX 支持的游戏或程序时&#xff0c;系统会调用 d3dcompiler 47.dll 文件。如果该文件丢失或损坏&#xff0c;我们将无法正常运行这些游戏或程序&#xff0c;从而给…

外汇天眼:交易的本质就是要解决这两个问题!

方向 在交易中&#xff0c;方向的判断至关重要。尽管判断对错在很大程度上是一个概率游戏&#xff0c;但我们可以细分方法来更好地解决这个问题。解决方向的方法可以总结为三大类&#xff1a; 1.通过容错和次数来解决方向 纯粹的逆市加码被认为是低级的做法&#xff0c;因为…

详细解析下gRPC examples-RBAC authenication-权限组管理-基于自定义Token

详细解析下gRPC examples-RBAC authenication-权限组管理-基于自定义Token 什么是RABC认证&#xff1f; RBAC (Role-Based Access Control) 授权策略是一种用于控制系统或应用程序中用户或实体对资源的访问权限的方法。在 RBAC 中&#xff0c;访问控制是基于角色的&#xff0…

快速找到离群值的三种方法

本文将介绍3个在数据集中查找离群值的Python方法 离群值&#xff08;Outliers&#xff09;是指在数据集中与其他数据点明显不同或者异常的数据点。这些数据点可能比其他数据点要远离数据集的中心&#xff0c;或者具有异常的数值。离群值可能是由于数据采集错误、异常事件、测量…

大型监控网络设备架构

IT监控架构的功效日益突出&#xff0c;已成为企业信息化建设不可或缺的一部分。本文将详细介绍IT监控架构的含义、构成、功能及其在公司中的应用。 IT监控架构的含义是什么&#xff1f; 简单来说&#xff0c;IT监控架构就是利用一系列技术和方法对公司的IT系统进行全方位的监控…

【LeetCode热题100】--73.矩阵置零

73.矩阵置零 使用标记数组&#xff1a; 使用两个标记数组分别记录每一行和每一列是否有零出现 先遍历一次数组&#xff0c;如果某个元素为0&#xff0c;则将该元素所在的行和列所对应的标记数组的位置为true&#xff0c;最后再遍历该数组&#xff0c;用标记数组更新原数即可 …

《优化接口设计的思路》系列:第四篇—接口的权限控制

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 《优化接口设计的思路》系列&#xff1a;第三篇—留下用户调用接口的痕迹 《优化接口设计的思路》系列&#…

开学选什么样的电容笔好用?ipad可以用的手写笔

自从ipad等平板电脑开始使用电容笔以来&#xff0c;电容笔已经完全代替了我们的手指&#xff0c;并且使我们的书写速度有了很大的提高。但由于Apple Pencil内置的高科技芯片&#xff0c;价格始终居高不下&#xff0c;这让不少人&#xff0c;尤其是在校学生&#xff0c;也是难以…