[问题解决] 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);
    }
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值