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

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

 更新時(shí)間:2025年03月20日 09:07:49   作者:不想CRUD的小凱  
這篇文章主要介紹了java中InputStream轉(zhuǎn)為MultipartFile的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(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給到對方
  • 但其實(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à)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot文件上傳功能的實(shí)現(xiàn)方法

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

    這篇文章主要介紹了SpringBoot文件上傳功能的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(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ù)庫對事務(wù)的支持,使用JDBC的事務(wù)管理機(jī)制,就是利用java.sql.Connection對象完成對事務(wù)的提交,需要的朋友可以參考下
    2023-10-10
  • Spring的AOP極簡入門

    Spring的AOP極簡入門

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

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

    這篇文章主要介紹了Java?對象在?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ì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 淺析Java單例設(shè)計(jì)模式(自寫demo)

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

    Java單例模式是看起來以及用起來簡單的一種設(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)了繼承,并對其中基于注解方式的定時(shí)任務(wù)實(shí)現(xiàn)了非常好的支持,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • java實(shí)現(xiàn)雙色球機(jī)選號碼生成器

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

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

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

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

最新評論

长汀县| 平安县| 那曲县| 嘉祥县| 南部县| 高雄市| 九龙县| 平安县| 阿勒泰市| 元氏县| 南陵县| 怀集县| 九龙县| 德格县| 崇州市| 合川市| 聊城市| 谷城县| 嘉禾县| 安顺市| 内江市| 翁源县| 资兴市| 孝感市| 剑阁县| 泰安市| 中阳县| 乐都县| 沅江市| 洛宁县| 新竹市| 阳东县| 宁海县| 沧州市| 建始县| 梨树县| 扎囊县| 绍兴市| 东莞市| 泾川县| 福州市|