RestTemplate使用InputStreamResource上传文件

news2024/9/21 14:52:21

背景

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();
    }
}
  •  使用阿里云提供的OSS Java SDK

 贴上阿里云文档的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文件下载,也适用于用户上传一个文件上传之后,你的服务需要上传到另一个服务器,不用在你的服务器留存,直接使用流上传即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程池自查注意点

文章目录线程池自查注意点1、线程池的标准创建方式2、线程池的任务调度流程3、避免使用Executors快捷创建线程池3.1、newSingleThreadExecutor()3.2、newCachedThreadPool()3.3、ScheduledThreadPool()4、避免在方法中创建线程池5、不要盲目使用同步队列6、使用线程池&#xff…

MySQL库的操作

文章目录MySQL库的操作创建数据库创建数据库案例字符集和校验规则查看系统默认字符集以及校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响操纵数据库查看数据库显示创建语句修改数据库删除数据库备份和恢复数据库的备份和恢复表的备份和恢…

Cracking the Safes之Linux系统下gdb调试

Cracking Safe是什么 挑战是找出四个保险箱中每个保险箱预期的正确的5个输入集。在运行二进制安全程序时,您需要一次输入一个猜测,如下所示: 其实,就是输入5次,程序会对输入内容进行判断,只有符合程序要求才能成功,任务就是逆向找到正确的字符串!!! 解题思路 反汇…

mac pro M1(ARM)安装:centos8.0虚拟机

0.引言 mac发布了m1芯片&#xff0c;其强悍的性能收到很多开发者的追捧&#xff0c;但是也因为其架构的更换&#xff0c;导致很多软件或环境的安装成了问题&#xff0c;之前我们讲解了如何安装centos7。这次我们接着来看如何在mac m1环境下安装centos8 1.下载 1.1 安装VMwar…

Java基于springboot+vue的五金用品销售购物商城系统 前后端分离

五金用品是当前很多家庭和维修人员必备的工具&#xff0c;他们可以让维修变的更加简单&#xff0c;甚至有很多维修必须有配套的专业工具才能够完成&#xff0c;但是很多时候人们在五金店购买这些五金用品的时候不是价格昂贵就是缺少一些想要的工具&#xff0c;这个是通过开发一…

Guava 对 Map的操作

Guava是google公司开发的一款Java类库扩展工具包&#xff0c;内含了丰富的API&#xff0c;涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码&#xff0c;使代码更为优雅&#xff0c;另一方面它补充了很多jdk中没有的功能&#xff0c;能让我们开发中更…

C语言刷题(2)

&#x1f412;博客名&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 文件拷贝 问题描述&#xff1a; 小蓝正在拷贝一份文件&#xff0c;他现在已经拷贝了 t 秒时间&#xff0c;已经拷贝了 c 字节&#…

解决eclipse导入svn项目报 403Forbidden

解决eclipse导入svn项目报 403Forbidden问题&#xff1b; 首先&#xff0c;产生这个问题的原因&#xff1a;①导入的svn项目没有权限&#xff1b;②上次导入的svn项目在身份验证的时候保存了用户名以及密码&#xff1b;&#xff08;我遇到这个情况的原因是因为②&#xff09; …

个人网页制作 个人网页设计作业 HTML CSS个人网页模板 大学生个人介绍网站毕业设计 DW个人主题网页模板下载 个人网页成品代码 个人网页作品下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

编码器的电路介绍

编码器的结构特点以及以及使用 对于8线到三线的编码器&#xff0c;一定是八线输入&#xff0c;三线输出&#xff0c;有十一条线 但是74HC148是一个16引脚的芯片 有十一线上述的信号&#xff0c;还有电源线以及地线&#xff0c;此时我们就有了13条线 另外的线则是归于控制信…

kubernetes深入理解之Service

版权声明&#xff1a;本文为CSDN博主「开着拖拉机回家」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 主页地址&#xff1a;开着拖拉机回家的博客_CSDN博客-Linux,Java基础学习,MySql数据库领域博主 目录 一、概述 1.1 Serv…

【salesforce平台基础】-想到啥写点啥

【salesforce基础】-想到啥写点啥1.salesforce架构2.学习过程中常见的几个“公司”&#x1f92d;3.术语4.平台的用途&#xff08;举例说明&#xff09;5.AppExchange&#xff08;软件应用商店&#xff09;6.sandbox7.平台入门1.salesforce架构 salesforce是一家云公司&#xf…

7.关于线性回归模型的QA

为什么使用平方损失而不是绝对差值呢&#xff1f; 答&#xff1a; 二者区别不大&#xff0c;但是绝对差值是一个不可导的函数&#xff0c;在零点的时候&#xff0c;绝对差值的导数会有点难求。 损失为什么要求平均&#xff1f; 答&#xff1a;求平均的话&#xff0c;梯度是在…

原语科技宣布完成千万级天使+轮融资,致力于打造隐私计算标准化产品

原语科技 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 180篇…

【基础算法】多项式三大运算 C++实现

●多项式计算 一维多项式就是包含一个变量的多项式&#xff0c;一个一维多项式示例如下&#xff1a; 一维多项式求值就是对于上述多项式&#xff0c;计算在指定的x处的函数值。一个通用的计算多项式值的算法可以采用递推的方式&#xff0c;可以将上述多项式变为如下的等价形式…

位运算 离散化 区间和算法

目录一、位运算1.1 思路1.1 例题&#xff1a;二进制中1的个数二、离散化2.1 概念2.2 例题&#xff1a;区间和三、合并区间3.1 概念3.2 例题&#xff1a;合并区间一、位运算 1.1 思路 首先知道一个概念&#xff1a;一个正整数的负数等于其按位取反后1 -x ~x 1 举个例子&…

干货——生产型企业的供应商管理系统模板

供应商管理主要是是通过提高供货产品和服务质量及交付能力&#xff0c;缩短企业采购周期和生产成本&#xff0c;从而提升产品核心竞争力。随着如今信息技术的发展&#xff0c;采用先进的信息化手段更能够提升供应商管控能力&#xff0c;实现资源的有效整合&#xff0c;从而加强…

[附源码]计算机毕业设计疫苗药品批量扫码识别追溯系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

测试服务器的udping值

测试服务器的udping值参考下载工具步骤一&#xff1a;在服务器上启动UDP Echo服务(必须)启动**UDP Echo服务**步骤二&#xff1a;在客户端下载UDPing工具步骤三&#xff1a;在客户端测试UDPing值参考 https://help.aliyun.com/document_detail/158771.html UDPing项目地址: h…

阿里资深架构师整理分享的分布式系统架构:技术栈详解与进阶文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…