一、代码还有待优化的空间、可自行进行优化处理。
大致的思路就是:
1.1、通过url 转成 HttpURLConnection 从而获取到对应的url流文件
1.2、通过这个url流文件、转成 FileTIem
1.3、获取到FileTiem 后 直接 new CommonsMultipartFile();
注意:CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
直接上代码:
/**
* url转MultipartFile
*
* @param url 文件url
* @param fileName 文件新名称
* @return MultipartFile
*/
public static MultipartFile urlToMultipartFile(String url, String fileName) {
HttpURLConnection httpUrl = null;
MultipartFile multipartFile = null;
try {
LOGGER.debug("tip message: urlToMultipartFile文件转换中,url为:<{}> 文件名称为<{}>", url, fileName);
httpUrl = (HttpURLConnection) new URL(url).openConnection();
httpUrl.connect();
LOGGER.debug("tip message:成功建立httpUrl连接<{}>", httpUrl);
multipartFile = getMultipartFile(httpUrl.getInputStream(), fileName);
} catch (IOException e) {
LOGGER.error("error message: url解析失败,抛出url解析异常、原因:", e);
} finally {
assert httpUrl != null;
httpUrl.disconnect();
}
return multipartFile;
}
/**
* 通过InpuStream获取MultipartFile
*
* @param inputStream 文件的输入流
* @param fileName 文件新名称
* @return MultipartFile
*/
public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
FileItem fileItem = createFileItem(inputStream, fileName);
//CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
return new CommonsMultipartFile(fileItem);
}
private static FileItem createFileItem(InputStream inputStream, String fileName) {
FileItemFactory factory = new DiskFileItemFactory(16, null);
String textFieldName = "file";
FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName);
int bytesRead;
byte[] buffer = new byte[8192];
OutputStream os = null;
//使用输出流输出输入流的字节
try {
os = item.getOutputStream();
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
inputStream.close();
} catch (IOException e) {
LOGGER.error("error message: 文件上传失败、原因:<{}>", String.valueOf(e));
throw new IllegalArgumentException("文件上传失败");
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
LOGGER.error("Stream close exception", e);
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
LOGGER.error("Stream close exception", e);
}
}
}
return item;
}