關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴}
大家好,因為近期做需求中遇到了文件上傳這個東西,而且我這個還是跨服務(wù)去傳輸文件的所以我這邊使用了httpclient和RestTemplate去做,但是最后還是用的httpclient。feign和RestTemplate在超大文件下會OOM所以適用于小文件傳輸我這邊測試的在1G以下。httpclient好像是無限哈哈哈。(具體多少大家有時間可以去測一下)
1.被調(diào)用服務(wù)的Controller
1.這塊使用@RequestParam(“file”)或者@RequestPart(“file”)都是可以接到參數(shù)的。
2.(“file”)一定要和遠程調(diào)用代碼傳的參數(shù)名一樣 否則接不到參數(shù)。
@RequestMapping(value = "/remoteCallUpload",method = RequestMethod.POST)
@ApiOperation("測試遠程調(diào)用上傳")
public String remoteCallUpload(@RequestParam("file") MultipartFile file){
System.out.println(file);
return "成功";
}
1.RestTemplate
1.如果用RestTemplate的話首先需要把RestTemplate交給spring去管理所以先來一個配置類。
2.@SuppressWarnings(“all”) 這個注解是jdk自帶的的意思是 意志所有的警告。
@Configuration
@SuppressWarnings("all")
public class RestTemplateConfig {
@Autowired
RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate() {
return builder.build();
}
}
2.RestTemplate遠程調(diào)用文件傳輸
這里有幾個要注意的地方
1.必須重寫否則傳輸時報錯
ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
};
2.設(shè)置請求頭因為就在模擬前端發(fā)送上傳文件的請求所以請求頭必須是multipart/form-data
3.第三個參數(shù)是被調(diào)用Controller的返回值類型,我的測試Controller寫的是String所以我的這邊第三參數(shù)就是String.Class
restTemplate.postForObject(url, files, String.class);
4.url就是被調(diào)用服務(wù)的地址 如:
http://192.168.3.7:50003/test/remoteCallUpload
以上是注意事項。
@Autowired
private 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遠程調(diào)用文件傳輸
1.httpclient這段代碼有要用的小伙伴直接粘過去就能用
注意一下返回值自己改一下就行execute.getEntity()
@SneakyThrows
private String gettesthttpclient(MultipartFile file, String url) {
CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(10000)
.setConnectTimeout(5000)
.build();
HttpPost httpPost = new HttpPost(url);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
// 解決中文文件名亂碼問題
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.setCharset(Consts.UTF_8);
ContentType contentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), Consts.UTF_8);
entityBuilder.addBinaryBody("file", file.getInputStream(), ContentType.DEFAULT_BINARY, file.getOriginalFilename());
httpPost.setEntity(entityBuilder.build());
httpPost.setConfig(requestConfig);
HttpResponse execute = httpclient.execute(httpPost);
String flag = EntityUtils.toString(execute.getEntity());
return flag;
}
總結(jié)
遠程調(diào)用使用了RestTemplate和httpclient也可以使用feign,但是RestTemplate和feign大文件會OOM,httpclient不會所以大家可以根據(jù)自己場景去選擇。

到此這篇關(guān)于關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴}的文章就介紹到這了,更多相關(guān)springboot MultipartFile文件跨服務(wù)傳輸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用FeignClient進行微服務(wù)交互方式(微服務(wù)接口互相調(diào)用)
這篇文章主要介紹了使用FeignClient進行微服務(wù)交互方式(微服務(wù)接口互相調(diào)用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Sprigmvc項目轉(zhuǎn)為springboot的方法
本篇文章主要介紹了Sprigmvc項目轉(zhuǎn)為springboot的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
Java 中文字符按Unicode排序的實現(xiàn)方法
這篇文章主要介紹了Java 中文字符按Unicode排序的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10
SpringBoot自定義注解實現(xiàn)Token校驗的方法
這篇文章主要介紹了SpringBoot自定義注解實現(xiàn)Token校驗的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

