码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • RestTemplate使用InputStreamResource上传文件


    背景

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

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

     开干

    • RestTemplate使用配置
    1. import org.springframework.boot.web.client.RestTemplateBuilder;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.client.RestTemplate;
    5. @Configuration
    6. public class RestTemplateConfig {
    7. @Bean
    8. public RestTemplate restTemplate() {
    9. RestTemplateBuilder builder = new RestTemplateBuilder();
    10. return builder.build();
    11. }
    12. }
    •  使用阿里云提供的OSS Java SDK

     贴上阿里云文档的SDK截图

     最重要的就是这句:

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

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

    1. OSSObject.java
    2. public class OSSObject extends GenericResult implements Closeable {
    3. private String key;
    4. private String bucketName;
    5. private ObjectMetadata metadata = new ObjectMetadata();
    6. private InputStream objectContent;
    7. public OSSObject() {
    8. }
    9. public ObjectMetadata getObjectMetadata() {
    10. return this.metadata;
    11. }
    12. public void setObjectMetadata(ObjectMetadata metadata) {
    13. this.metadata = metadata;
    14. }
    15. public InputStream getObjectContent() {
    16. return this.objectContent;
    17. }
    18. ......
    19. }

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

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

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

    1. // 获取OSS文件
    2. ossObject = ossService.getOssObject(file.getPath());
    3. InputStream fileInputStream = ossObject.getObjectContent();
    4. HttpHeaders headers = new HttpHeaders();
    5. headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    6. MultiValueMap body = new LinkedMultiValueMap<>();
    7. Long fileSize = ossObject.getObjectMetadata().getContentLength();
    8. InputStreamResource resource = new InputStreamResource(fileInputStream) {
    9. @Override
    10. public String getFilename() {
    11. return file.getName();
    12. }
    13. @Override
    14. public long contentLength() {
    15. return fileSize;
    16. }
    17. };
    18. body.add("FileContent", resource);
    19. HttpEntity httpEntity = new HttpEntity<>(body, headers);
    20. registerRes = restTemplate.postForEntity("oos接口url", httpEntity, "接受类Class").getBody();
    21. ossObject.close();
    22. 如上代码我使用的是InputStreamResource接受到OSS给到的InputStream流,重写了getFilename()方法,和contentLength()方法 

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

      至此,就上传成功了。。

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

    23. 相关阅读:
      这可能是最权威、最全面的Go语言编码风格规范了!
      VMware网络设置 桥接模式 NAT VMNET0 1 8
      使用 nvm 实现对 Node 的多版本管理
      Nginx配置使用详解
      Android视图手册之Service
      怎样使用SQL SERVER新建立一个数据库
      ABAP 选择屏幕多页签
      C++ enum与enum class对比
      Linux之字符设备驱动框架
      Linux进程通信-POSIX IPC
    24. 原文地址:https://blog.csdn.net/qq_34776233/article/details/128162173
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号