java中InputStream转为MultipartFile的解决方案

 更新时间:2025年03月20日 09:07:49   作者:不想CRUD的小凯  
这篇文章主要介绍了java中InputStream转为MultipartFile的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java中InputStream转为MultipartFile

问题出现原因

  • 我所处理的服务端需要进行Feign调用,其中出现了需要文件传输的步骤。
  • 由于服务端的文件存于OSS中,我能拿到的只有文件所在url
  • 被调用方的Client采用MultipartFile接收
  • 因此需要从中进行处理,返回MultipartFile给到对方
  • 但其实,已经有其他的实现类,只需要引Maven包即可,而我为了避免引包才编写如下代码。

解决方式

  • 自己实现一个MulitpartFile接口
static class DefaultMultiPartFile implements MultipartFile {
    private final String name;
    private String originalFilename;
    @Nullable
    private String contentType;
    private final byte[] content;

    DefaultMultiPartFile(String name, @Nullable byte[] content) {
      this(name, "", (String)null, content);
    }

    DefaultMultiPartFile(String name, String originalFilename, @Nullable String contentType, byte[] content) {
      this.name = name;
      this.originalFilename = originalFilename;
      this.contentType = contentType;
      this.content = content;
    }

    @Override
    public String getName() {
      return this.name;
    }

    @Override
    public String getOriginalFilename() {
      return this.originalFilename;
    }

    @Override
    public String getContentType() {
      return this.contentType;
    }

    @Override
    public boolean isEmpty() {
      return content.length==0;
    }

    @Override
    public long getSize() {
      return content.length;
    }

    @Override
    public byte[] getBytes() throws IOException {
      return content;
    }

    @Override
    public InputStream getInputStream() throws IOException {
      return new ByteArrayInputStream(content);
    }

    @Override
    public void transferTo(File file) throws IOException, IllegalStateException {
      FileCopyUtils.copy(this.content, file);
    }
  }
  • 整合功能之后,最终编写的Util类:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.springframework.lang.Nullable;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

public class MultipartFileUtil {
  
  public static MultipartFile inputStreamToMultipartFile(InputStream inputStream,String name) throws IOException {
    byte[] bytes = readInputStream(inputStream);
    DefaultMultiPartFile defaultMultiPartFile = new DefaultMultiPartFile(name, bytes);
    return defaultMultiPartFile;
  }

  public static MultipartFile multipartFileByUrl(String url,String name) throws IOException{
    URL downloadUrl = new URL(url);
    URLConnection urlConnection = downloadUrl.openConnection();
    // 超时时间20s
    urlConnection.setConnectTimeout(20*1000);
    urlConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
    InputStream inputStream = urlConnection.getInputStream();
    return inputStreamToMultipartFile(inputStream,name);
  }

  private static byte[] readInputStream(InputStream inputStream) throws IOException {
    byte[] buffer = new byte[1024];
    int len = 0;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    while ((len = inputStream.read(buffer)) != -1) {
      bos.write(buffer, 0, len);
    }
    bos.close();
    return bos.toByteArray();
  }


  static class DefaultMultiPartFile implements MultipartFile {
    private final String name;
    private String originalFilename;
    @Nullable
    private String contentType;
    private final byte[] content;

    DefaultMultiPartFile(String name, @Nullable byte[] content) {
      this(name, "", (String)null, content);
    }

    DefaultMultiPartFile(String name, String originalFilename, @Nullable String contentType, byte[] content) {
      this.name = name;
      this.originalFilename = originalFilename;
      this.contentType = contentType;
      this.content = content;
    }

    @Override
    public String getName() {
      return this.name;
    }

    @Override
    public String getOriginalFilename() {
      return this.originalFilename;
    }

    @Override
    public String getContentType() {
      return this.contentType;
    }

    @Override
    public boolean isEmpty() {
      return content.length==0;
    }

    @Override
    public long getSize() {
      return content.length;
    }

    @Override
    public byte[] getBytes() throws IOException {
      return content;
    }

    @Override
    public InputStream getInputStream() throws IOException {
      return new ByteArrayInputStream(content);
    }

    @Override
    public void transferTo(File file) throws IOException, IllegalStateException {
      FileCopyUtils.copy(this.content, file);
    }
  }

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于JDK+Tomcat+eclipse+MyEclipse的配置方法,看这篇够了

    关于JDK+Tomcat+eclipse+MyEclipse的配置方法,看这篇够了

    关于JDK+Tomcat+eclipse+MyEclipse的配置问题,很多朋友都搞不太明白,网上一搜配置方法多种哪种最精简呢,今天小编给大家分享一篇文章帮助大家快速掌握JDK Tomcat eclipse MyEclipse配置技巧,需要的朋友参考下吧
    2021-06-06
  • Java实现电影院订票系统代码

    Java实现电影院订票系统代码

    这篇文章主要介绍了Java实现电影院订票系统代码,代码实现了界面类登录注册类,用户类等,具有一定参考价值,需要的朋友可以参考下。
    2017-11-11
  • springboot log4j2日志框架整合与使用过程解析

    springboot log4j2日志框架整合与使用过程解析

    这篇文章主要介绍了springboot log4j2日志框架整合与使用,包括引入maven依赖和添加配置文件log4j2-spring.xml的相关知识,需要的朋友可以参考下
    2022-05-05
  • Java实现字符串转换成可执行代码的方法

    Java实现字符串转换成可执行代码的方法

    今天小编就为大家分享一篇Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • IntelliJ IDEA中如何调试Java Stream操作

    IntelliJ IDEA中如何调试Java Stream操作

    这篇文章主要介绍了IntelliJ IDEA中如何优雅的调试Java Stream操作,在强大的IDEA插件支持下,stream的调试其实也没那么难了,下面就来学习一下在IDEA中如何调试stream操作吧
    2022-05-05
  • SpringBoot中的响应式web应用详解

    SpringBoot中的响应式web应用详解

    这篇文章主要介绍了SpringBoot中的响应式web应用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 浅谈Java中的Filter过滤器

    浅谈Java中的Filter过滤器

    本篇文章主要介绍了浅谈Java中的Filter过滤器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringCloud Ribbon负载均衡工具使用

    SpringCloud Ribbon负载均衡工具使用

    Ribbon是Netflix的组件之一,负责注册中心的负载均衡,有助于控制HTTP和TCP客户端行为。Spring Cloud Netflix Ribbon一般配合Ribbon进行使用,利用在Eureka中读取的服务信息,在调用服务节点时合理进行负载
    2023-02-02
  • Java实现读取163邮箱,qq邮箱的邮件内容

    Java实现读取163邮箱,qq邮箱的邮件内容

    这篇文章主要利用Java语言实现读取163邮箱和qq邮箱的邮件内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • idea运行main方法或Test避免编译整个应用的实现方法

    idea运行main方法或Test避免编译整个应用的实现方法

    这篇文章主要介绍了idea运行main方法或Test避免编译整个应用的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论