RestTemplate使用InputStreamResource上传文件

背景

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 {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplateBuilder builder = new RestTemplateBuilder();
        return builder.build();
    }
}

 贴上阿里云文档的SDK截图

 最重要的就是这句:

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

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

OSSObject.java

public 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<String, Object> body = new LinkedMultiValueMap<>();
        Long fileSize = ossObject.getObjectMetadata().getContentLength();
        InputStreamResource resource = new InputStreamResource(fileInputStream) {
            @Override
            public String getFilename() {
                return file.getName();
            }
            @Override
            public long contentLength() {
                return fileSize;
            }
        };
        body.add("FileContent", resource);
        HttpEntity<Object> httpEntity = new HttpEntity<>(body, headers);
        registerRes = restTemplate.postForEntity("oos接口url", httpEntity, "接受类Class").getBody();
        ossObject.close();

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

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

至此,就上传成功了。。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值