千家信息网

如何使用RestTemplate调用远程接口上传文件

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,今天就跟大家聊聊有关如何使用RestTemplate调用远程接口上传文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RestTemplate
千家信息网最后更新 2026年11月01日如何使用RestTemplate调用远程接口上传文件

今天就跟大家聊聊有关如何使用RestTemplate调用远程接口上传文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

    RestTemplate 调用远程接口上传文件

    问题描述

    第三方写了一个文件上传的接口,该接口的请求方式为Post请求,请求参数全部是以form-data表单形式进行提交,包含三个参数

    • 第一个:cookie(字符串类型)

    • 第二个:seqNo(字符串类型)

    • 第三个:file(文件类型)

    解决方法

    使用传统的Spring Cloud的Feign组件在调用远程接口实现文件上传时有时会出现异常错误,可考虑使用下述两种方式文件上传

    第一种方式

    使用RestTemplate进行调用

    import org.springframework.core.io.InputStreamResource; import java.io.InputStream; public class CommonInputStreamResource extends InputStreamResource {    private long length;    private String fileName;     public CommonInputStreamResource(InputStream inputStream, long length, String fileName) {        super(inputStream);        this.length = length;        this.fileName = fileName;    }     /**     * 覆写父类方法     * 如果不重写这个方法,并且文件有一定大小,那么服务端会出现异常     * {@code The multi-part request contained parameter data (excluding uploaded files) that exceeded}     */    @Override    public String getFilename() {        return fileName;    }     /**     * 覆写父类 contentLength 方法     * 因为 {@link org.springframework.core.io.AbstractResource#contentLength()}方法会重新读取一遍文件,     * 而上传文件时,restTemplate 会通过这个方法获取大小。然后当真正需要读取内容的时候,发现已经读完,会报如下错误。     */    @Override    public long contentLength() {        long estimate = length;        return estimate == 0 ? 1 : estimate;    }     public void setLength(long length) {        this.length = length;    }     public void setFileName(String fileName) {        this.fileName = fileName;    }}
    try{    String applySeqNo = "123456";    String cookie="654321";    File file=new File("E:\\1.rar");    FileInputStream fileInputStream=new FileInputStream(file);     //请求头设置为MediaType.MULTIPART_FORM_DATA类型    HttpHeaders requestHeaders = new HttpHeaders();    requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);        //构建请求体    MultiValueMap requestBody = new LinkedMultiValueMap<>();    CommonInputStreamResource commonInputStreamResource = null;    try {        commonInputStreamResource = new CommonInputStreamResource(fileInputStream,file.length(),file.getName());    } catch (Exception e) {         log.error("文件输入流转换错误",e);    }    requestBody.add("cookie", cookie);    requestBody.add("seqNoFile", applySeqNo);    requestBody.add("file",commonInputStreamResource);    HttpEntity requestEntity = new HttpEntity(requestBody, requestHeaders);        //直接调用远程接口    ResponseEntity responseEntity = restTemplate.postForEntity("http://xxx.xxx.xxx.xxx:8080/test/upload",requestEntity, String.class);    System.out.println("返回结果:"+responseEntity.getBody())}catch (Exception e){    log.error("远程调用出现异常:", e);}
    第二种方式

    Spring Cloud Feign组件 + MultiValueMap + CommonInputStreamResource

    CommonInputStreamResource对象的构造在上面已经实现了这里就不再重复构造,沿用上面的那个就行

    feign接口

    @Component@FeignClient(name = "taxRecodes", url = "${spider.url}", qualifier = "TaxRecodeFeignClient",fallback = TaxRecodeFallBack.class)public interface TaxRecodeFeignClient {        /**     * 单证申请-合同信息表附件上传     */    @PostMapping(value = "/attachFile/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)    String attachFileUpload(MultiValueMap multiValueMap);}

    请求部分

    @PostMapping("/upload")public void upload(){    try {        File file=new File("E:\\1.rar");        FileInputStream fileInputStream=new FileInputStream(file);         CommonInputStreamResource commonInputStreamResource = null;        try {            commonInputStreamResource = new CommonInputStreamResource(fileInputStream,fileInputStream.available(),file.getName());        } catch (Exception e) {            log.error("文件输入流转换错误:",e);        }         MultiValueMap dto=new LinkedMultiValueMap();        dto.add("cookie","xxx");        dto.add("file",commonInputStreamResource);        dto.add("seqNoFile","xxx");         String returnInfo = taxRecodeFeignClient.attachFileUpload(dto);        JSONObject returnInfoJsonObject = JSONObject.parseObject(returnInfo);    }catch (Exception e){        log.error("异常:",e);    }}

    RestTemplate调用远程接口添加请求头

    项目中我们经常会碰到与第三方系统对接,通过调用第三方系统中的接口来集成服务,为了接口的安全性都为加一些验证,比如:

    basic、authority等,通过请求头添加authrization的机制比较容易接入,从第三方系统获取到authorization,然后请求接口时在请求头上带上获取到的authorization,说了怎么多不如直接上代码更容易理解。

    // 获取第三方的authorizationString auth= OAuthContentHelper.getAuthorizationHeader();HttpHeaders requestHeader=new HttpHeaders();// 将获取到的authorization添加到请求头requestHeader.add(AuthConstants.AUTHORIZATION_HEADER,auth);// 构建请求实体HttpEntity requestEntity=new HttpEntity(requestParam,requestHeaders);// 使用restTemplate调用第三方接口restTemplate.exchage(url,HttpMethod.POST,requestEntity,responseClass);

    看完上述内容,你们对如何使用RestTemplate调用远程接口上传文件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

    接口 文件 方法 第三方 内容 方式 类型 错误 系统 三个 参数 大小 字符 字符串 组件 服务 输入 安全 代码 传统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网与科技 深圳恒合互联网络科技有限公司 伴你行互联网科技有限公司 互联网科技网站 上海亿帐通互联网科技 宁波青枫互联网科技有限公司 福建科技产业互联网发展 互联网与医疗科技 呼和浩特新华互联网科技学院 燊美集互联网科技有限公司 互联网科技创新的路径 工业互联网等科技实现智能化赋能 互联网科技如何创业 长沙互联网科技 科技互联网的核心竞争力 电子商务与互联网科技的关系 广西科技产业互联网是什么 互联网科技手抄报图片 互联网时代高科技布局 株洲百竞科技的互联网营销顾问 科技互联网企业 河南真二互联网科技有限公司 国外互联网科技网站 联恩商钥互联网科技有限公司 哈尔滨屹滨互联网科技有限公司 伊宁互联网科技做什么的 互联网科技股为什么大涨 互联网科技包装股份有限公司上市 求路客互联网科技电话 上海旺乐尼互联网科技有限公司
    0