你好。 因为最近在做需求的过程中遇到了文件上传这个东西,而且我还是跨服务传输文件,所以我这边用了http客户端和RestTemplate做了,但是最后用的http客户端。 因为feign和RestTemplate在超大型文件下OOM,所以适合传输小文件。 我这里测试的是1G以下。 http客户端就像无限哈哈哈。 (具体来说,有时间的话请测量一下) ) )。
1.被调用服务的Controller
1.您可以使用此@requestpart (“文件”)或@requestpart请求部件)“文件”)来接收参数。 2.)“文件”)必须与通过远程调用代码传递的参数名称相同,才能连接到参数。@ request mapping (值=' /远程计算负载',方法=请求方法.后期) )。
@ApiOperation (“测试远程调用上载”) ) ) ) ) ) ) ) ) ) )。
公共资源调用文件(@请求参数('文件) )多文件) {
系统输出(文件;
返回成功;
使用}
1.RestTemplate
1.RestTemplate时,首先需要将resttemplate传递给spring进行管理,因此请先给我一个配置类。 2.@suppresswarnings(“all”)这句话意味着jdk所拥有意志的所有警告。@Configuration
@suppresswarnings('all ' () ) () ) ) ) ) ) ) ) ) ) ) ) )至) ) ) )中的一个词。
公共类别还原模板配置{
@自动无线
resttemplatebuilder生成器;
@Bean
公共还原模板还原模板(
返回构建器.构建器(;
}
(}
2.RestTemplate远程调用文件传输
这里有几个需要注意的地方1 .如果不改写的话,在传送时报告错误
bytearrayresourcebytearrayresource=newbytearrayresource (文件. getbytes ) ) )
@Override
公共字符串getfilename
返回文件. getoriginalfilename (;
}
(; 2 .设定请求标头为了通过模拟前端发送文件上载请求,请求标头必须是multipart/form-data
3 .第三个参数是Controller调用的返回值类型,我的测试Controller写的是String,所以这里的第三个参数是String.Class
rest template.postforobject (网址、文件、字符串.类); 4.url是像:一样调用的服务的地址
3358192.168.3.7336050003/test/remotecallupload以上是注意事项。
@自动无线
私有注册模板;
privatestringgettestresttemplate (多文件,字符串URL ) throws IOException {
httpheadersheaders=newhttpheaders (;
媒体类型=媒体类型.透视媒体类型(多媒体/表单-数据);
headers.set内容类型(类型;
MultiValueMapString,对象表格=newlinkedmultivaluemap (;
bytearrayresourcebytearrayresource=newbytearrayresource (文件. getbytes ) ) )
@Override
公共字符串getfilename
返回文件. getoriginalfilename (;
}
(;
form.add (“文件”,字节资源;
form.add ('文件名',文件.几何信息文件名) );
//用HttpEntity封装整个请求消息
HttpEntityMultiValueMapString,对象文件=newhttpentity (形式,头);
字符串标志=rest template.postforobject (URL,文件,字符串.类);
返回标志;
}
12345678910112131415161718192021223
3.HttpClient
1 .在使用http客户端时,首先引入pom文件坐标。从属关系
组org.Apache.http组件/组id
artifactidhttpclient/artifact id
版本4.5.6 /版本
/从属关系
从属关系
组org.Apache.http组件/组id
影响ttpmime /影响id
版本4.5.6 /版本
/从属关系
12345678910
3.HttpClient远程调用文件传输
1.http客户端这个代码直接粘贴了要使用的合作伙伴,所以小心翼翼地自己更改返回值就行了。 execute.getEntity (@SneakyThrows
privatestringgettesthttpclient (多端口文件,字符串文件) {
closeablehttpclienthttpclient=http clients.create默认(;
请求配置=请求配置. custom (
. setconnectionrequesttimeout (10000 )。
. setconnecttimeout(5000 ) )
. build (;
http后期http后期=新http后期(URL;
multipartentitybuilderentitybuilder=multipartentitybuilder.create (;
//解决中文文件名的乱码问题
实体生成器. setmode (httpmultipartmode .浏览器_兼容;
实体生成器. set charset (consts.utf _ 8;
内容类型内容类型=内容类型.创建(内容类型.文本_平面.获取时间类型),Consts.UTF_8);
实体生成器. addbinarybody (文件),文件获取输入),内容类型.默认_二进制,文件获取文件库
htppost.set entity (实体生成器.构建器);
htppost.set配置(请求配置);
httpresponse execute=http客户端. execute (http开机自检;
字符串标志=实体工具. tostring (执行.获取实体();
返回标志;
}
总结
远程呼叫可以使用RestTemplate和http客户端也可以使用feign,但是RestTemplate和feign的大文件变成了OOM,不能使用http客户端,所以大家都可以使用自己的client