java中InputStream转为MultipartFile的解决方案
更新时间:2025年03月20日 09:07:49 作者:不想CRUD的小凯
这篇文章主要介绍了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);
}
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
关于JDK+Tomcat+eclipse+MyEclipse的配置方法,看这篇够了
关于JDK+Tomcat+eclipse+MyEclipse的配置问题,很多朋友都搞不太明白,网上一搜配置方法多种哪种最精简呢,今天小编给大家分享一篇文章帮助大家快速掌握JDK Tomcat eclipse MyEclipse配置技巧,需要的朋友参考下吧2021-06-06
springboot log4j2日志框架整合与使用过程解析
这篇文章主要介绍了springboot log4j2日志框架整合与使用,包括引入maven依赖和添加配置文件log4j2-spring.xml的相关知识,需要的朋友可以参考下2022-05-05
IntelliJ IDEA中如何调试Java Stream操作
这篇文章主要介绍了IntelliJ IDEA中如何优雅的调试Java Stream操作,在强大的IDEA插件支持下,stream的调试其实也没那么难了,下面就来学习一下在IDEA中如何调试stream操作吧2022-05-05
idea运行main方法或Test避免编译整个应用的实现方法
这篇文章主要介绍了idea运行main方法或Test避免编译整个应用的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-04-04


最新评论