SpringBoot使用RestTemplate如何通過(guò)http請(qǐng)求將文件下載到本地
背景
最近被安排了一個(gè)活,純體力的重復(fù)性工作,將開發(fā)一個(gè)項(xiàng)目的指定資源通過(guò)現(xiàn)有的下載接口下載下來(lái)。
思路
因?yàn)闆](méi)有提供批量下載接口,同時(shí)下載的資源需要自己篩選,想著這樣人工處理特別麻煩,個(gè)人也沒(méi)有什么進(jìn)步,就想著寫一段代碼處理,這樣處理起來(lái)準(zhǔn)確,效率高,后續(xù)有類似的任務(wù)還可以將這段代碼改改后繼續(xù)使用。
1.篩選
篩選出需要的下載文件的id,這個(gè)可以根據(jù)業(yè)務(wù)調(diào)整,不一定是id,具體的實(shí)現(xiàn)根據(jù)業(yè)務(wù)邏輯實(shí)現(xiàn);
2.下載
下載方式有兩種,一種是通過(guò)postman或者apifox這種工具,通過(guò)提前構(gòu)建參數(shù)和提供寫有參數(shù)的文件,批量出發(fā)請(qǐng)求,這種只是大致想到的可以不靠編碼實(shí)現(xiàn)的方式;另外一種是借助后端代碼發(fā)起http請(qǐng)求,將下載的資源寫入本地文件中。下面簡(jiǎn)單介紹第二種,需要時(shí)可以批量下載文件。
實(shí)現(xiàn)方式
- 資源下載方法
public static void downloadFile(String url, HttpHeaders headers, RequestParams requestParams, String outputPath) throws IOException {
// 創(chuàng)建請(qǐng)求實(shí)體
HttpEntity<RequestParams> entity = new HttpEntity<>(requestParams, headers);
// 初始化RestTemplate,也可以自己構(gòu)建配置類。
final RestTemplate restTemplate = new RestTemplate();
// 請(qǐng)求配置
ResponseEntity<Resource> response = restTemplate.exchange(
URI.create(url),
HttpMethod.POST,
entity,
Resource.class
);
// 請(qǐng)求成功校驗(yàn)
if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
// 獲取資源
Resource resource = response.getBody();
// 確保目錄存在
File outputFile = new File(outputPath);
File parentDir = outputFile.getParentFile();
// 文件存在校驗(yàn)
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());
}
}- 實(shí)體類(可以自己定義)
@Data
public class RequestParams implements Serializable {
private Long id;
}- 函數(shù)調(diào)用
public static void downloadPerPaper(PaperInfo paperInfos) throws IOException {
//url
String url="https://xxxx.com";
//請(qǐng)求頭
HttpHeaders headers = new HttpHeaders();
headers.set("xxx","xxxxx");
//請(qǐng)求參數(shù)
final RequestParams requestParams = new RequestParams();
requestParams.setId(1L);
//存在存放地址
String path="xx/xx/xx.doc";
//調(diào)用下載方法
downloadFile(url,headers,requestParams,path);
}異常處理
Exception in thread "main" java.nio.file.AccessDeniedException: xx/xx/xx
出現(xiàn)這種報(bào)錯(cuò)是必須指定的具體的文件,而不是文件夾,同時(shí)盡量保證存放文件的文件夾必須存在
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot使用RestTemplate發(fā)送http請(qǐng)求的實(shí)操演示
- SpringBoot使用RestTemplate實(shí)現(xiàn)HTTP請(qǐng)求詳解
- springboot中RestTemplate發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)示例
- springboot中RestTemplate配置HttpClient連接池詳解
- 基于springboot的RestTemplate、okhttp和HttpClient對(duì)比分析
- SpringBoot 利用RestTemplate http測(cè)試
- 關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯?wèn)題
相關(guān)文章
Springboot2.0配置JPA多數(shù)據(jù)源連接兩個(gè)mysql數(shù)據(jù)庫(kù)方式
這篇文章主要介紹了Springboot2.0配置JPA多數(shù)據(jù)源連接兩個(gè)mysql數(shù)據(jù)庫(kù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(49)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08
詳解Java中Array和ArrayList的比較和轉(zhuǎn)換
在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結(jié)構(gòu),用來(lái)存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點(diǎn)極大地影響應(yīng)用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強(qiáng)項(xiàng)和弱點(diǎn),,需要的朋友可以參考下2023-08-08
詳解Spring學(xué)習(xí)之編程式事務(wù)管理
本篇文章主要介紹了詳解Spring學(xué)習(xí)之編程式事務(wù)管理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Spring?Boot?Actuator?漏洞利用小結(jié)
spring對(duì)應(yīng)兩個(gè)版本,分別是Spring Boot 2.x和Spring Boot 1.x,因此后面漏洞利用的payload也會(huì)有所不同,這篇文章主要介紹了Spring?Boot?Actuator?漏洞利用小結(jié),需要的朋友可以參考下2023-11-11
Java實(shí)現(xiàn)幾種常見(jiàn)排序算法代碼
排序(Sorting) 是計(jì)算機(jī)程序設(shè)計(jì)中的一種重要操作,它的功能是將一個(gè)數(shù)據(jù)元素(或記錄)的任意序列,重新排列成一個(gè)關(guān)鍵字有序的序列2013-09-09
Java利用LocalDate進(jìn)行日期處理的完全指南
這篇文章主要為大家詳細(xì)介紹了Java利用LocalDate進(jìn)行日期處理的詳細(xì)教程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

