RestTemplate使用InputStreamResource上传文件
创始人
2024-03-15 10:31:24
0

背景

1. 我们应用服务是Spring boot项目,预览服务是我们另一个团队提供的用.net写的,最终使用的是office online来实现文件预览的功能。
2. 我们文件在阿里云OSS存储,我们需要预览文件需要将文件上传至预览服务器。
3. 计划使用RestTemplate将文件上传到OOS(Office Online Server)。

之前没有写过这种用流的方式进行上传,查询方法之后,一般两种方式:
1. 先下载到本地,然后本地再上传到OOS上(占存储,并且还需要上传完清理掉)
2. 直接使用流的方式,从OSS拿到流之后直接上传到OOS上(推荐)

 开干

  • RestTemplate使用配置
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {RestTemplateBuilder builder = new RestTemplateBuilder();return builder.build();}
}
  •  使用阿里云提供的OSS Java SDK

 贴上阿里云文档的SDK截图

 最重要的就是这句:

OSSObject ossObject = ossClient.getObject(bucketName, objectName); 

可以看到 阿里云OSS getObject 得到的是一个 OSSObject对象,我们看看他的源码

OSSObject.javapublic class OSSObject extends GenericResult implements Closeable {private String key;private String bucketName;private ObjectMetadata metadata = new ObjectMetadata();private InputStream objectContent;public OSSObject() {}public ObjectMetadata getObjectMetadata() {return this.metadata;}public void setObjectMetadata(ObjectMetadata metadata) {this.metadata = metadata;}public InputStream getObjectContent() {return this.objectContent;}
......
}

这里面的 objectContent其实就是我们需要的InputStream

搞清楚这个之后我们就要进行下一步了,将流上传到我们的预览服务器。

直接上代码,这里主要是使用RestTemplate的postForEntity方法上传文件到OOS。

 // 获取OSS文件ossObject = ossService.getOssObject(file.getPath());InputStream fileInputStream = ossObject.getObjectContent();HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);MultiValueMap body = new LinkedMultiValueMap<>();Long fileSize = ossObject.getObjectMetadata().getContentLength();InputStreamResource resource = new InputStreamResource(fileInputStream) {@Overridepublic String getFilename() {return file.getName();}@Overridepublic long contentLength() {return fileSize;}};body.add("FileContent", resource);HttpEntity httpEntity = new HttpEntity<>(body, headers);registerRes = restTemplate.postForEntity("oos接口url", httpEntity, "接受类Class").getBody();ossObject.close();
 

如上代码我使用的是InputStreamResource接受到OSS给到的InputStream流,重写了getFilename()方法,和contentLength()方法 

注意:如果使用InputStreamResource,这俩方法必须得重写!!

至此,就上传成功了。。

这种方式不仅适用于OSS文件下载,也适用于用户上传一个文件上传之后,你的服务需要上传到另一个服务器,不用在你的服务器留存,直接使用流上传即可。

相关内容

热门资讯

准确适用法律,有效震慑“职业闭... 据媒体报道,上海市公安局经侦总队近日牵头侦破一起新型“职业闭店人”合同诈骗案,抓获顾某、韩某等4名犯...
男子分居期间贷款32.5万元买... 12月24日,记者从新疆法治报获悉:近日塔城地区中级人民法院审结了一起案件,明确表明车贷因未用于共同...
盛路通信(002446)披露与... 截至2025年12月25日收盘,盛路通信(002446)报收于10.75元,较前一交易日上涨10.0...
德州新华书店组织专题研讨 深入... 大众网记者 张冉 通讯员 李晓腾 德州报道 近日,德州新华书店组织召开全民阅读相关政策专题研讨交流会...
阿尔及利亚立法认定“法国殖民是... 阿尔及利亚国民议会(众议院)24日晚表决通过法案,将法国对这个非洲国家曾经的殖民统治定性为“犯罪”,...
专访鲁政委:结构性货币政策工具... 2025年,站在“十四五”收官与“十五五”规划谋篇的历史衔接点上,中国经济在多重变局中展现出韧性,金...
广末凉子有望明年复出!曾飙速1... 搜狐娱乐讯 据日媒,广末凉子有望明年正式复出,相关人士称她一直很规矩,会向各界发邮件汇报近况,“这次...
浙江东日(600113)发布投... 截至2025年12月25日收盘,浙江东日(600113)报收于67.29元,较前一交易日上涨4.34...
广电网络:近12个月累计诉讼及... 中证智能财讯 广电网络(600831)12月25日晚间发布累计诉讼、仲裁情况公告,近十二个月内,公司...
封关后第一批!198公斤椰子油... 12月23日,海南保亭黎族苗族自治县一家食品企业生产的198公斤初榨椰子油,通过海口新海港和南港“二...