时间:2021-05-19
大家好,因为近期做需求中遇到了文件上传这个东西,而且我这个还是跨服务去传输文件的所以我这边使用了httpclient和RestTemplate去做,但是最后还是用的httpclient。feign和RestTemplate在超大文件下会OOM所以适用于小文件传输我这边测试的在1G以下。httpclient好像是无限哈哈哈。(具体多少大家有时间可以去测一下)
1.被调用服务的Controller
1.这块使用@RequestParam(“file”)或者@RequestPart(“file”)都是可以接到参数的。
2.(“file”)一定要和远程调用代码传的参数名一样 否则接不到参数。
1.RestTemplate
1.如果用RestTemplate的话首先需要把RestTemplate交给spring去管理所以先来一个配置类。
2.@SuppressWarnings(“all”) 这个注解是jdk自带的的意思是 意志所有的警告。
2.RestTemplate远程调用文件传输
这里有几个要注意的地方
1.必须重写否则传输时报错
ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); } };2.设置请求头因为就在模拟前端发送上传文件的请求所以请求头必须是multipart/form-data
3.第三个参数是被调用Controller的返回值类型,我的测试Controller写的是String所以我的这边第三参数就是String.Class
restTemplate.postForObject(url, files, String.class);4.url就是被调用服务的地址 如:
http://192.168.3.7:50003/test/remoteCallUpload以上是注意事项。
@Autowiredprivate RestTemplate restTemplate;private String gettestRestTemplate(MultipartFile file, String url) throws IOException { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("multipart/form-data"); headers.setContentType(type); MultiValueMap<String, Object> form = new LinkedMultiValueMap<>(); ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); } }; form.add("file", byteArrayResource); form.add("filename", file.getOriginalFilename()); //用HttpEntity封装整个请求报文 HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers); String flag = restTemplate.postForObject(url, files, String.class); return flag; }3.HttpClient
1.使用httpclient的话首先要引入pom文件坐标。
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.6</version> </dependency>3.HttpClient远程调用文件传输
1.httpclient这段代码有要用的小伙伴直接粘过去就能用
注意一下返回值自己改一下就行execute.getEntity()
总结
远程调用使用了RestTemplate和httpclient也可以使用feign,但是RestTemplate和feign大文件会OOM,httpclient不会所以大家可以根据自己场景去选择。
到此这篇关于关于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服务传输的问题的文章就介绍到这了,更多相关springboot MultipartFile文件跨服务传输内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
由于工作中使用MultipartFile与现有的一些上传文件组件冲突所以使用其他的接收上传文件的方法.首先我把MultipartFile类的配置文件注释掉.然后
SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定文件的类型(MIME
RestTemplate的多种实现使用JDK默认的httplibrary使用Apache提供的httpclient使用Okhttp3@Configuration
什么是RestTemplate传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spr
最近写文件上传到服务器读取的代码,前端使用FormData上传,服务端用MultipartFile接收,自己测试了下MultipartFile对象有什么东西,结