最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中InputStream轉(zhuǎn)為MultipartFile的解決方案

 更新時(shí)間:2025年03月20日 09:07:49   作者:不想CRUD的小凱  
這篇文章主要介紹了java中InputStream轉(zhuǎn)為MultipartFile的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java中InputStream轉(zhuǎn)為MultipartFile

問題出現(xiàn)原因

  • 我所處理的服務(wù)端需要進(jìn)行Feign調(diào)用,其中出現(xiàn)了需要文件傳輸?shù)牟襟E。
  • 由于服務(wù)端的文件存于OSS中,我能拿到的只有文件所在url
  • 被調(diào)用方的Client采用MultipartFile接收
  • 因此需要從中進(jìn)行處理,返回MultipartFile給到對(duì)方
  • 但其實(shí),已經(jīng)有其他的實(shí)現(xiàn)類,只需要引Maven包即可,而我為了避免引包才編寫如下代碼。

解決方式

  • 自己實(shí)現(xiàn)一個(gè)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();
    // 超時(shí)時(shí)間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);
    }
  }

}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決使用@Component會(huì)導(dǎo)致spring.factories中的EnableAutoConfiguration無效問題

    解決使用@Component會(huì)導(dǎo)致spring.factories中的EnableAutoConfiguration無效

    這篇文章主要介紹了解決使用@Component會(huì)導(dǎo)致spring.factories中的EnableAutoConfiguration無效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot文件上傳功能的實(shí)現(xiàn)方法

    SpringBoot文件上傳功能的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot文件上傳功能的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring集成事務(wù)代碼實(shí)例

    Spring集成事務(wù)代碼實(shí)例

    這篇文章主要介紹了Spring集成事務(wù)代碼實(shí)例,pring事務(wù)的本質(zhì)其實(shí)就是數(shù)據(jù)庫對(duì)事務(wù)的支持,使用JDBC的事務(wù)管理機(jī)制,就是利用java.sql.Connection對(duì)象完成對(duì)事務(wù)的提交,需要的朋友可以參考下
    2023-10-10
  • Spring的AOP極簡(jiǎn)入門

    Spring的AOP極簡(jiǎn)入門

    今天小編就為大家分享一篇關(guān)于Spring的AOP極簡(jiǎn)入門,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java?對(duì)象在?JVM?中的內(nèi)存布局超詳細(xì)解說

    Java?對(duì)象在?JVM?中的內(nèi)存布局超詳細(xì)解說

    這篇文章主要介紹了Java?對(duì)象在?JVM?中的內(nèi)存布局超詳細(xì)解說,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Spring Boot使用JSR-380進(jìn)行校驗(yàn)的示例

    Spring Boot使用JSR-380進(jìn)行校驗(yàn)的示例

    這篇文章主要介紹了Spring Boot使用JSR-380進(jìn)行校驗(yàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 淺析Java單例設(shè)計(jì)模式(自寫demo)

    淺析Java單例設(shè)計(jì)模式(自寫demo)

    Java單例模式是看起來以及用起來簡(jiǎn)單的一種設(shè)計(jì)模式,但是就實(shí)現(xiàn)方式以及原理來說,也并不淺顯,下面這篇文章主要給大家詳細(xì)介紹了Java中單例模式,需要的朋友可以參考下
    2021-12-12
  • SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件的三種方法案例詳解

    SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件的三種方法案例詳解

    這篇文章主要介紹了SpringBoot三種方法實(shí)現(xiàn)定時(shí)發(fā)送郵件的案例,Spring框架的定時(shí)任務(wù)調(diào)度功能支持配置和注解兩種方式Spring?Boot在Spring框架的基礎(chǔ)上實(shí)現(xiàn)了繼承,并對(duì)其中基于注解方式的定時(shí)任務(wù)實(shí)現(xiàn)了非常好的支持,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • java實(shí)現(xiàn)雙色球機(jī)選號(hào)碼生成器

    java實(shí)現(xiàn)雙色球機(jī)選號(hào)碼生成器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雙色球機(jī)選號(hào)碼生成器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • JAVA集合框架工具類自定義Collections集合方法

    JAVA集合框架工具類自定義Collections集合方法

    今天小編就為大家分享一篇關(guān)于JAVA集合框架工具類自定義Collections集合方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論

克拉玛依市| 神农架林区| 海南省| 色达县| 阳新县| 石阡县| 宁海县| 历史| 手游| 裕民县| 麟游县| 扶沟县| 海盐县| 秦安县| 类乌齐县| 班玛县| 堆龙德庆县| 军事| 北流市| 泉州市| 淳化县| 巢湖市| 三原县| 遵化市| 江永县| 阳原县| 若尔盖县| 准格尔旗| 德钦县| 平陆县| 江山市| 巴南区| 霍林郭勒市| 兴文县| 万山特区| 科技| 家居| 凤阳县| 武清区| 苗栗县| 安远县|