SpringBoot 使用RestTemplate通过http请求讲文件下载到本地

背景

最近被安排了一个活,纯体力的重复性工作,将开发一个项目的指定资源通过现有的下载接口下载下来。

思路

因为没有提供批量下载接口,同时下载的资源需要自己筛选,想着这样人工处理特别麻烦,个人也没有什么进步,就想着写一段代码处理,这样处理起来准确,效率高,后续有类似的任务还可以将这段代码改改后继续使用。

1.筛选
筛选出需要的下载文件的id,这个可以根据业务调整,不一定是id,具体的实现根据业务逻辑实现;

2.下载
下载方式有两种,一种是通过postman或者apifox这种工具,通过提前构建参数和提供写有参数的文件,批量出发请求,这种只是大致想到的可以不靠编码实现的方式;另外一种是借助后端代码发起http请求,将下载的资源写入本地文件中。下面简单介绍第二种,需要时可以批量下载文件。

实现方式

资源下载方法

public static void downloadFile(String url, HttpHeaders headers, RequestParams requestParams, String outputPath) throws IOException {// 创建请求实体HttpEntity<RequestParams> entity = new HttpEntity<>(requestParams, headers);// 初始化RestTemplate,也可以自己构建配置类。final RestTemplate restTemplate = new RestTemplate();// 请求配置ResponseEntity<Resource> response = restTemplate.exchange(URI.create(url),HttpMethod.POST,entity,Resource.class);// 请求成功校验if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {// 获取资源Resource resource = response.getBody();// 确保目录存在File outputFile = new File(outputPath);File parentDir = outputFile.getParentFile();// 文件存在校验if (parentDir != null && !parentDir.exists()) {if (!parentDir.mkdirs()) {throw new IOException("Failed to create directory: " + parentDir);}}//获取流try (InputStream inputStream = resource.getInputStream();OutputStream outputStream = Files.newOutputStream(outputFile.toPath())) {StreamUtils.copy(inputStream, outputStream);}} else {throw new IOException("Failed to download file: " + response.getStatusCode());}}

实体类(可以自己定义)

@Data
public class RequestParams implements Serializable {private Long id;
}

函数调用

    public static void downloadPerPaper(PaperInfo paperInfos) throws IOException {//urlString url="https://xxxx.com";//请求头HttpHeaders headers = new HttpHeaders();headers.set("xxx","xxxxx");//请求参数final RequestParams requestParams = new RequestParams();requestParams.setId(1L);//存在存放地址String path="xx/xx/xx.doc";//调用下载方法downloadFile(url,headers,requestParams,path);}

异常处理

Exception in thread "main" java.nio.file.AccessDeniedException: xx/xx/xx

出现这种报错是必须指定的具体的文件,而不是文件夹,同时尽量保证存放文件的文件夹必须存在

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

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

相关文章

振动数据主流采集方式介绍及对比分析

一.振动数据主流采集方式 接触式&#xff1a;接触式振动传感器 非接触式&#xff1a;麦克风&#xff0c;激光振动传感器 二.采集方式对比分析 1.接触式振动传感器 优点&#xff1a; 直接接触被测物体&#xff0c;通常可以获得较为准确的振动数据。 结构简单&#xff0c;成本…

搜狗输入法的软键盘怎么关闭

我的搜狗输入法软件盘和typora中ctrlshiftk冲突了&#xff0c;关闭软键盘

框架必知必会——Autofac概述及应用

Autofac概述 Autofac 是一个依赖注入框架&#xff0c;它遵循控制反转&#xff08;Inversion of Control, IoC&#xff09;原则&#xff0c;通过构造函数注入、属性注入等方式来管理对象的依赖关系。它的核心原理是将对象的创建和生命周期管理交给容器&#xff0c;而不是在代码…

2024.6.9周报

目录 摘要 ABSTRACT 一、文献阅读 1、相关信息 2、摘要 3、文献解读 1、Introduction 2、文章主要贡献 3、模型架构 4、实验 4、结论 二、代码实现 总结 摘要 本周我阅读了一篇题目为《Unlocking the Potential of Transformers in Time Series Forecasting with …

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第8章——可微性

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 8. 可微性(Differentiability) 本章讨论梯度(gradients)/斜率(slopes)和切线(tangent)&#xff0c;指出常见的误解并解释如何避免这些误解。将可微性的定义与图形表示联系起来&#xff0c;展示如何将其应用…

【2024】零基础Python 快速入门篇

2023年是AI的元年&#xff0c;AI的爆火不仅推动了科技领域的进步&#xff0c;更让 Python 语言成为了这一变革中的关键角色。 Python 语言简单易懂&#xff0c;语法清晰明了&#xff0c;懂一点英语的都能学得会。很适合在职场摸爬滚打多年的前端组长作为捅破天花板的语言&…

SASS模块化与组织文件

在前端开发中&#xff0c;CSS预处理器已经成为我们不可或缺的工具&#xff0c;其中Sass是最受欢迎的之一。如果你想要提升你的Sass代码的可维护性、可重用性和可读性&#xff0c;下面的最佳实践将帮助你更好地组织和模块化你的Sass。 1. 文件组织与模块化 Sass允许我们将样式…

Linux服务器扩容及磁盘分区(LVM和非LVM)

Linux扩容及磁盘分区&#xff08;LVM和非LVM&#xff09; 本文主要介绍了阿里云服务器centos的扩容方法&#xff1a;非LVM分区扩容方法&#xff08;系统盘&#xff09;&#xff0c;以及磁盘改LVM并分区&#xff08;数据盘&#xff09;。主要是ext4文件系统及xfs磁盘scsi MBR分…

【轻量化】YOLOv10: Real-Time End-to-End Object Detection

论文题目&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 研究单位&#xff1a;清华大学 论文链接&#xff1a;http://arxiv.org/abs/2405.14458 代码链接&#xff1a;https://github.com/THU-MIG/yolov10 推荐测试博客&#xff1a;YOLOv10最全使用教程&#xff0…

现代密码学-X.509认证业务

X.509的基础式公钥密码体制和数字签名。 证书 证书的格式 证书由可信的认证机构CA建立并由CA或者用户自己将其放入目录&#xff0c;以供其他用户方便访问。目录服务器本身并不负责为用户建立公钥证书&#xff0c;仅仅为用户访问公钥提供方便。 x.509证书格式 证书的获取 其…

微前端基于qiankun微前端应用间通信方案实践

【qiankunvue】微前端子应用之间的通信方式总结 ------------------------------------------------------------------补充--------------------------------------------------------- 什么是微前端&#xff1f; 微前端 微前端是一种多个团队通过独立发布功能的方式来共同构…

全局路径规划之4.5:Kinodynamic A*算法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言Kinodynamic A*算法1、前端kinodynamic A*算法动力学路径搜索的功能2、步骤一:进行实时采样,离散的获得一些轨迹点(节点point_set,即创建open_l…

【Linux】用户和组的管理、综合实训

目录 实训1&#xff1a;用户的管理 实训2:组的管理 实训3:综合实训 实训1&#xff1a;用户的管理 (1)创建一个新用户userl&#xff0c;设置其主目录为/home/user 1。 (2)查看/etc/passwd 文件的最后一行&#xff0c;看看是如何记录的。 (3)查看文件/etc/shadow文件的最后一…

NLP入门——数据预处理:编码规范化

编码规范化 在计算机中&#xff0c;我们需要将字符与字节序列之间建立起映射关系&#xff0c;这个过程被称为编码。有许多不同的编码方式&#xff0c;例如 ASCII、UTF-8、UTF-16 和 GBK 等。这些编码方式会将每个字符编码为一个或多个字节&#xff0c;以便于在计算机、网络和其…

使用ipdb来在终端上面进行debug

在终端上使用 ipdb 进行调试是一个非常强大的方式&#xff0c;可以帮助你在Python代码中设置断点&#xff0c;检查变量值&#xff0c;逐步执行代码等。以下是一个基本的教程&#xff0c;介绍如何在Python代码中使用 ipdb 进行调试&#xff1a; 安装 ipdb 首先&#xff0c;你需…

封装了一个仿照抖音评论轮播效果的iOS轮播视图

效果图 原理 就是我们在一个视图里面有两个子视图&#xff0c;一个是currentView, 一个是willShowView,在一次动画过程中&#xff0c;我们改变current View的frame&#xff0c;同时改变willShowView的frame&#xff0c;同时&#xff0c;需要改变currentVIew 的transform.y不然…

软件管理、rpm安装、yum安装、源码编译安装

目录 一、Windows安装/卸载 二、软件的卸载&#xff1a; 三、Linux的软件安装和卸载 3.1rpm安装 第一步&#xff1a;挂在光盘 第二步&#xff1a;查看/mnt 第三步&#xff1a;切换到/mnt/Packages 第四步&#xff1a;安装 3.2yum安装&#xff08;使用关盘作为yum源&…

Facechain系列: constants.py文件解读

在根目录下还有个facechain目录&#xff0c;其中的constants.py文件中定义了代码控制的重要参数。 1.姿态控制 在应用代码进行推理&#xff08;见这里Facechain系列: 通过代码进行推理&#xff09;中&#xff0c;如果将以下代码 use_pose_model False 修改为 use_pose_mo…

低代码专题 | 低代码开发平台一般都有哪些功能和模块?

在上一篇文章中&#xff0c;我们已经对低代码开发平台的概念进行了初步的探讨&#xff0c;认识到了低代码开发平台提高开发效率、降低技术门槛方面的巨大潜力。 然而&#xff0c;要真正掌握并应用低代码开发平台&#xff0c;还需要深入了解其背后的功能与模块构成。这篇就对低…

【数据结构】平衡二叉树(AVL树)

目录 前言 一、AVL树概念 二、AVL树节点定义 三、AVL树插入 1. 按照二叉搜索树的方式插入新节点 2. 维护节点的平衡因子与调整树的结构 a. 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 b. 新节点插入较高右子树的右侧---右右&#xff1a;左单旋 c. 新节点插入…