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è)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- 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)文章
解決使用@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),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
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),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
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)碼生成器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雙色球機(jī)選號(hào)碼生成器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01

