Springboot项目 RestTemplate+httpclient实现文件的上传和下载

2023-11-11

1.pom.xml

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>

2.代码

2.1 RestTemplate配置
import lombok.extern.slf4j.Slf4j;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;

@Slf4j
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
        SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
        //使用httpclient的factory
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        // 设置链接超时 毫秒
        requestFactory.setConnectTimeout(6000);
        // 设置读取超时 毫秒
        requestFactory.setReadTimeout(60000);
        requestFactory.setHttpClient(httpClient);
        return new RestTemplate(requestFactory);
    }
}
2.2 获取bean工具类
package com.example.springbootresttemplate.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextHelper implements ApplicationContextAware {

    private static ApplicationContext appCtx;

    /**
     * 通过name获取 Bean.
     *
     * @param name bean名
     * @return 返回
     */
    public static Object getBean(String name) {
        return appCtx.getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz bean类
     * @return 返回
     */
    public static <T> T getBean(Class<T> clazz) {
        return appCtx.getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name  bean名
     * @param clazz bean类
     * @return 返回
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return appCtx.getBean(name, clazz);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("初始化applicationContext:" + applicationContext.getBeanDefinitionNames().length);
        appCtx = applicationContext;
    }
}

2.3 RestTemplate工具类
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class RestTemplateUtils {

    /**
     * 自定义请求头
     * 简单的 Get请求
     *
     * @param headers 参数
     * @param url     参数
     * @return 返回
     */
    public static ResponseEntity<String> simpleGet(HttpHeaders headers, String url) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
        //将请求头部和参数合成一个请求
        HttpEntity<?> httpEntity = new HttpEntity<>(headers);
        return restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, httpEntity, String.class);
    }

    /**
     * 表单 - Query
     * 带参数 Get请求
     *
     * @param headers 参数
     * @param url     参数
     * @param params  参数
     * @return 返回
     */
    public static ResponseEntity<String> executeGetParam(HttpHeaders headers, String url, Map<String, String> params) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        headers.set("Content-Type", "application/x-www-form-urlencoded");
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
        if (params != null && params.size() > 0) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                builder.queryParam(entry.getKey(), entry.getValue());
            }
        }
        //将请求头部和参数合成一个请求
        HttpEntity<?> httpEntity = new HttpEntity<>(headers);
        return restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, httpEntity, String.class);
    }

    /**
     * 自定义请求头
     * - Query
     * - Body
     * 简单的 Post 请求
     *
     * @param headers 参数
     * @param url     参数
     * @return 返回
     */
    public static ResponseEntity<String> simplePost(HttpHeaders headers, String url) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        //将请求头部和参数合成一个请求
        HttpEntity<String> httpEntity = new HttpEntity<>(null, headers);
        return restTemplate.postForEntity(url, httpEntity, String.class);
    }

    /**
     * 表单 - Query
     * 带参数的 Post 请求
     *
     * @param headers 参数
     * @param url     参数
     * @param params  参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostFromParam(HttpHeaders headers, String url, Map<String, String> params) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        return restTemplate.postForEntity(url, getMultiValueMap(headers, null, params), String.class);
    }

    /**
     * 表单 - Query
     * 上传单个文件的 Post 请求
     *
     * @param headers 参数
     * @param url     参数
     * @param file    参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostFromFile(HttpHeaders headers, String url, File file) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        List<File> files = new ArrayList<>();
        files.add(file);
        return restTemplate.postForEntity(url, getMultiValueMap(headers, files, null), String.class);
    }

    /**
     * 表单 - Query
     * 上传多个文件的 Post 请求
     *
     * @param headers 参数
     * @param url     参数
     * @param files   参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostFromFile(HttpHeaders headers, String url, List<File> files) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        return restTemplate.postForEntity(url, getMultiValueMap(headers, files, null), String.class);
    }

    /**
     * 表单 - Query
     * 上传单个文件且带参数的 Post 请求
     *
     * @param headers 参数
     * @param url     参数
     * @param file    参数
     * @param params  参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostFromFileParam(HttpHeaders headers, String url, File file, Map<String, String> params) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        List<File> files = new ArrayList<>();
        files.add(file);
        return restTemplate.postForEntity(url, getMultiValueMap(headers, files, params), String.class);
    }

    /**
     * 表单 - Query
     * 上传多个文件且带参数的 Post 请求
     *
     * @param headers 参数
     * @param url     参数
     * @param files   参数
     * @param params  参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostFromFileParam(HttpHeaders headers, String url, List<File> files, Map<String, String> params) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        return restTemplate.postForEntity(url, getMultiValueMap(headers, files, params), String.class);
    }

    private static HttpEntity<MultiValueMap<String, Object>> getMultiValueMap(HttpHeaders headers, List<File> files, Map<String, String> params) {
        MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
        if (files != null && files.size() > 0) {
            headers.set("Content-Type", "multipart/form-data");
            for (File file : files) {
                multiValueMap.add("file", new org.springframework.core.io.FileSystemResource(file));
            }
        } else {
            headers.set("Content-Type", "application/x-www-form-urlencoded");
        }
        if (params != null && params.size() > 0) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                multiValueMap.add(entry.getKey(), entry.getValue());
            }
        }
        return new HttpEntity<>(multiValueMap, headers);
    }

    /**
     * Body请求 - Body
     *
     * @param headers 参数
     * @param url     参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostBody(HttpHeaders headers, String url) {
        return executePostBodyParam(headers, url, null);
    }

    /**
     * Body请求 - Body
     *
     * @param headers 参数
     * @param url     参数
     * @param str     参数
     * @return 返回
     */
    public static ResponseEntity<String> executePostBodyParam(HttpHeaders headers, String url, String str) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        headers.set("Content-Type", "application/json;charset=UTF-8");
        HttpEntity<String> httpEntity = new HttpEntity<>(str, headers);
        return restTemplate.postForEntity(url, httpEntity, String.class);
    }

    /**
     * 简单的文件下载,获取字节数组
     *
     * @param url 连载链接
     * @return 返回
     */
    public static ResponseEntity<byte[]> downloadFileSmall(String url) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        return restTemplate.getForEntity(url, byte[].class);
    }

    /**
     * 大文件的下载
     *
     * @param url        下载链接
     * @param targetPath 文件保存的本地路径(全路径)
     *                   对于大文件的下载,建议使用流的方式来解决。
     *                   即每次接收到一部分数据就直接写入到文件。这里我使用使用 Files 的 copy 方法来处理流。
     */
    public static void downloadFileBig(String url, String targetPath) {
        RestTemplate restTemplate = ApplicationContextHelper.getBean(RestTemplate.class);
        //定义请求头的接收类型
        RequestCallback requestCallback = request -> request.getHeaders()
                .setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));
        //定义请求头的接收类型
        restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> {
            Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath));
            return null;
        });
    }
}
2.4 测试
    @Test
    void RestTemplateTest() {
        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", "application/json;charset=UTF-8");
        headers.set("token", "******************");
        ResponseEntity<String> responseEntity = RestTemplateUtils.simplePost(headers, "https://getman.cn/mock/test");
        System.out.println(responseEntity);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot项目 RestTemplate+httpclient实现文件的上传和下载 的相关文章

随机推荐

  • Maven项目中出现红色波浪线的解决过程

    一 问题分类 对于Maven项目出现红色波浪线可以首先对报错情况进行分析 我遇到的两种表现形式 还有其他的形式 请多多指教 形式一 所用文件均出现红色波浪线 此问题可能是配置问题 形式二 maven项目 Plugins Dependenci
  • Element-Ui

    安装环境搭建 Element Ul是饿了么前端团队推出的一款基于Vue js 2 0 的桌面端UI框架 一套为开发者 设计师和产品经理准备的基于 Vue 2 0 的桌面端组件库 手机端有对应框架是Mint UI 中文文档 http elem
  • 蓝桥杯 奇数倍数

    蓝桥杯 奇数倍数 题目 请你找到最小的整数 X 同时满足 1 X 是 2019 的整倍数 2 X 的每一位数字都是奇数 思路 1 先找2019倍数 2 判断它的每一位是否是奇数 Java代码 public class 奇数倍数 public
  • 2022跨年烟花代码(一)Canvas绘制3D烟花动画特效

    Canvas绘制3D烟花动画特效 html代码
  • Knife4j+gateway动态路由聚合微服务API

    概述 knife4j的聚合API 其实官网有现成的例子 但包括其他能搜索到的资料都是基于静态网关的配置 我们现有的都是结合nacos实现动态网关配置 基于此留下这篇完整的教程文档 说明 本文假定你有一定的springcloud等相关知识 如
  • 树莓派安装配置syncthing

    下载 从这里下载软件 下载后解压 把二进制文件放到 usr local bin 目录 在命令行输入syncthing version命令 能打印出版本即可 自动启动 Unit Description Syncthing Open Sourc
  • struts2验证框架的两种方式

    第一种 在action同目录下建立 action validation xml
  • 关于JavaScript的浅拷贝和深拷贝

    关于JavaScript的浅拷贝和深拷贝 在 JS 中有一些基本类型像是Number String Boolean 而对象就是像这样的东西 name Larry skill Node js 对象跟基本类型最大的不同就在于他们的传值方式 基本
  • logging的使用python3

    以时间命名输出日志 def init logging t str time strftime Y m d H M time localtime filename log s txt t logging basicConfig level l
  • 刷题 3.10

    目录 1 约瑟夫环 蓝桥231 2 排它平方数 蓝桥712 3 买不到的数目 蓝桥213 思维题 思路 因为有解 两个数一定互质 不能拼成的最大数是xy x y 4 回文日期 1 约瑟夫环 蓝桥231 题目描述 n 个人的编号是 1 n 如
  • handsontable使用及遇到的坑--公式计算(思路)

    公式 公式的计算可使用堆栈的思想将运算符后置 如 C1 A1 A2 5 B1可以变换成 A1 A2 5 B1 计算过程为 假设A1 1 A2 2 B1 3 C1 A1 A2 5 B1 A1 A2 5 B1 1 2 5 3 3 5 3 15
  • 腾讯三面(hr面)之轻松过关

    腾讯二面之细节大曝光中最后提到 22号晚上11 00先后分别收到邮件 短信与电话通知 腾讯邀请你于4月23号16点到珞珈山国际酒店3楼2号会议室参加软件开发类面试 请携带简历提前5分钟到达 腾讯科技 23号上午 同样在旅馆查询资料 虽然很多
  • 【华为提前批】笔试 测评 面试 全流程(结构与材料工程师)

    目录 提前批流程 笔试 性格测试 专业面试1 2 主管面 终面 最后 祝各位旗开得胜 提前批流程 一般综合测评会在笔试之后发放 可选择之后再做 流程里面是安排在两轮技术面之后的 笔试 7 12 性格测试 7 14 专业面试1 7 24 专业
  • flutter 路由插件fluro配置及其使用

    flutter 路由插件fluro配置及其使用 pubspec yaml 引入插件 dependencies flutter sdk flutter fluro 1 6 3 1 首先创建一个router handler dart文件 定义路
  • 数据挖掘与机器学习——数据挖掘概述

    挖掘是从大量的 不完全的 有噪声的 模糊的 随机的应用数据中 提取潜在且有用的信息的过程 分析分析处理 On Line Analytical Processing OLAP 数据分析过程 确定知识发现的目标 确定知识发现的目的 数据采集 数
  • Segmentation简记-Joint shape learning and segmentation for medical images

    Segmentation简记 Joint shape learning and segmentation for medical images using a minimalistic deep network 创新点 1 In this
  • react中dispatch_在react中class和function组件调用dispatch的方式

    copy党的疑问 function Checklist dispatch list dataSource loading total page current function editHandler id values dispatch
  • 使用 System.Net.Mail.MailMessage 发送电子邮件

    从 NET 2 0 开始 引入了一个新的类 System Net Mail MailMessage 该类用来取代 NET 1 1 时代的 System Web Mail MailMessage 类 System Net Mail MailM
  • flask sqlalchemy基本操作(查询)

    查询语法 查询一般有两种写法 db session query 和 lt 模型类 gt query lt 过滤方法 gt db session query 查询TestCase 模型类中id 137 的数据 db session query
  • Springboot项目 RestTemplate+httpclient实现文件的上传和下载

    1 pom xml