java中InputStream转为MultipartFile的解决方案
作者:不想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); } } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。