不在本地生成文件的情况下,从网络获取文件并发送到另一个服务器~⁽(◍˃̵͈̑ᴗ˂̵͈̑)⁽
程序员文章站
2022-04-12 22:09:37
天天跟我做,每天十分钟前言(。•ᴗ-)_开始操作了鸭(。•ᴗ-)_前言(。•ᴗ-)_最近项目忙的头晕眼花几篇博客都难产了今天老大丢给我一个文档说让我对接一下另一个公司的系统没办法咯,要恰饭的嘛,搞~(˘͈ᵕ ˘͈❀)但是在对接过程中发现一个问题第三方需要一个文件流而不是一个URL路径接收一个路径不香吗非要一个流开始操作了鸭(。•ᴗ-)_首先我们拿到的也是一个URL,也就是说我们需要把这个URL转为一个输入流我并不想在本地生成一个文件,再上传过去,这样并发的话硬盘IO根本顶不住,...
天天跟我做,每天十分钟
前言(。•ᴗ-)_
最近项目忙的头晕眼花
几篇博客都难产了
今天老大丢给我一个文档说让我对接一下另一个公司的系统
没办法咯,要恰饭的嘛,搞~(˘͈ᵕ ˘͈❀)
但是在对接过程中发现一个问题第三方需要一个文件流
而不是一个URL路径
接收一个路径不香吗
非要一个流
开始操作了鸭(。•ᴗ-)_
首先我们拿到的也是一个URL,也就是说我们需要把这个URL转为一个输入流
我并不想在本地生成一个文件,再上传过去,这样并发的话硬盘IO根本顶不住,所以我选择在内存中完成这个操作
/**
* 获取网络文件流
*
* @param url
* @return
*/
public static InputStream getImageStream(String url) {
try {
//打开连接
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
//设置超时时间
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
//请求方式GET
connection.setRequestMethod("GET");
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
//从连接获取输入流
InputStream inputStream = connection.getInputStream();
return inputStream;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
流是拿到了,现在构建一个文件
在内存中操作文件有一个非常好用的类MultipleFile
但是MultipleFile不能直接实例化…(╹⚇╹?)
但是他有一个实现类~(͏ ˉ ꈊ ˉ)✧˖°
直接使用实现类来操作就好了嘛~(⑅˃◡˂⑅)
InputStream inputStream = getImageStream("https://img-blog.csdnimg.cn/20200728165236752.png");
MultipartFile file = new MockMultipartFile("苏玛利.jpg", inputStream);
使用RestTemplate来发送请求~(。・ω・。)つ━☆
//转换
InputStream inputStream = getImageStream("https://img-blog.csdnimg.cn/20200728164802647.png");
MultipartFile file = new MockMultipartFile("苏玛利.jpg", inputStream);
//请求地址
String url = "www.baidu.com";
//拼接参数
LinkedMultiValueMap<Object, Object> params = new LinkedMultiValueMap<>();
//不能直接发送对象,需要转换一次
ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes());
params.add("contractModelAttach",byteArrayResource);
//设置请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
//设置请求实体
HttpEntity<LinkedMultiValueMap<Object, Object>> httpEntity = new HttpEntity<>(params, httpHeaders);
//发送请求
String result = restTemplate.postForObject(url, httpEntity, String.class);
System.out.println("result = " + result);
你们以为这样就结束了吗!那就大错特错了!
这样发送请求服务器并收不到文件
至于怎么操作呢,你们自己百度哦~ԅ(¯﹃¯ԅ)
错了错了,现在就讲,不要凶我( •̥́ ˍ •̀ू )
踩坑坑(ง ˙o˙)ว
因为是字节流直接传输过去,服务器获取不到文件名,所以需要给文件起个名字
//转换
InputStream inputStream = getImageStream("https://img-blog.csdnimg.cn/20200728164802647.png");
MultipartFile file = new MockMultipartFile("苏玛利.jpg", inputStream);
//请求地址
String url = "www.baidu.com";
//拼接参数
LinkedMultiValueMap<Object, Object> params = new LinkedMultiValueMap<>();
//不能直接发送对象,需要转换一次
//重写getFilename方法
ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()){
@Override
public String getFilename() throws IllegalStateException {
return file.getName();
}
};
params.add("contractModelAttach",byteArrayResource);
//设置请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
//设置请求实体
HttpEntity<LinkedMultiValueMap<Object, Object>> httpEntity = new HttpEntity<>(params, httpHeaders);
//发送请求
String result = restTemplate.postForObject(url, httpEntity, String.class);
System.out.println("result = " + result);
这样就可以成功的不在本地保存文件的情况下,把文件传输给给另一个服务器了~( ๑╹ ꇴ╹) グッ!
本文地址:https://blog.csdn.net/weixin_46526674/article/details/107639021