1. 我们应用服务是Spring boot项目,预览服务是我们另一个团队提供的用.net写的,最终使用的是office online来实现文件预览的功能。
2. 我们文件在阿里云OSS存储,我们需要预览文件需要将文件上传至预览服务器。
3. 计划使用RestTemplate将文件上传到OOS(Office Online Server)。
之前没有写过这种用流的方式进行上传,查询方法之后,一般两种方式:
1. 先下载到本地,然后本地再上传到OOS上(占存储,并且还需要上传完清理掉)
2. 直接使用流的方式,从OSS拿到流之后直接上传到OOS上(推荐)
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();}
}
贴上阿里云文档的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
如上代码我使用的是InputStreamResource接受到OSS给到的InputStream流,重写了getFilename()方法,和contentLength()方法
注意:如果使用InputStreamResource,这俩方法必须得重写!!
至此,就上传成功了。。
这种方式不仅适用于OSS文件下载,也适用于用户上传一个文件上传之后,你的服务需要上传到另一个服务器,不用在你的服务器留存,直接使用流上传即可。