java中InputStream轉(zhuǎn)為MultipartFile的解決方案
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è)參考,也希望大家多多支持腳本之家。
- Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111
- Java IO流操作(PipeInputStream、SequenceInputStream、BufferedInputStream)
- Java中的轉(zhuǎn)換流InputStreamReader解讀
- Java中的ByteArrayInputStream詳解
- java用字節(jié)數(shù)組解決FileInputStream讀取漢字出現(xiàn)亂碼問題
- Java中語音url轉(zhuǎn)換成InputStream的示例代碼
- java中InputStream獲取字節(jié)大小相關(guān)方法詳解
相關(guān)文章
關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置方法,看這篇夠了
關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置問題,很多朋友都搞不太明白,網(wǎng)上一搜配置方法多種哪種最精簡呢,今天小編給大家分享一篇文章幫助大家快速掌握J(rèn)DK Tomcat eclipse MyEclipse配置技巧,需要的朋友參考下吧2021-06-06Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼
這篇文章主要介紹了Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼,代碼實(shí)現(xiàn)了界面類登錄注冊類,用戶類等,具有一定參考價(jià)值,需要的朋友可以參考下。2017-11-11springboot?log4j2日志框架整合與使用過程解析
這篇文章主要介紹了springboot?log4j2日志框架整合與使用,包括引入maven依賴和添加配置文件log4j2-spring.xml的相關(guān)知識(shí),需要的朋友可以參考下2022-05-05Java實(shí)現(xiàn)字符串轉(zhuǎn)換成可執(zhí)行代碼的方法
今天小編就為大家分享一篇Java實(shí)現(xiàn)字符串轉(zhuǎn)換成可執(zhí)行代碼的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07IntelliJ IDEA中如何調(diào)試Java Stream操作
這篇文章主要介紹了IntelliJ IDEA中如何優(yōu)雅的調(diào)試Java Stream操作,在強(qiáng)大的IDEA插件支持下,stream的調(diào)試其實(shí)也沒那么難了,下面就來學(xué)習(xí)一下在IDEA中如何調(diào)試stream操作吧2022-05-05SpringBoot中的響應(yīng)式web應(yīng)用詳解
這篇文章主要介紹了SpringBoot中的響應(yīng)式web應(yīng)用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11SpringCloud Ribbon負(fù)載均衡工具使用
Ribbon是Netflix的組件之一,負(fù)責(zé)注冊中心的負(fù)載均衡,有助于控制HTTP和TCP客戶端行為。Spring?Cloud?Netflix?Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載2023-02-02Java實(shí)現(xiàn)讀取163郵箱,qq郵箱的郵件內(nèi)容
這篇文章主要利用Java語言實(shí)現(xiàn)讀取163郵箱和qq郵箱的郵件內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-02-02idea運(yùn)行main方法或Test避免編譯整個(gè)應(yīng)用的實(shí)現(xiàn)方法
這篇文章主要介紹了idea運(yùn)行main方法或Test避免編譯整個(gè)應(yīng)用的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04