關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴}
大家好,因?yàn)榻谧鲂枨笾杏龅搅宋募蟼鬟@個(gè)東西,而且我這個(gè)還是跨服務(wù)去傳輸文件的所以我這邊使用了httpclient和RestTemplate去做,但是最后還是用的httpclient。feign和RestTemplate在超大文件下會(huì)OOM所以適用于小文件傳輸我這邊測試的在1G以下。httpclient好像是無限哈哈哈。(具體多少大家有時(shí)間可以去測一下)
1.被調(diào)用服務(wù)的Controller
1.這塊使用@RequestParam(“file”)或者@RequestPart(“file”)都是可以接到參數(shù)的。
2.(“file”)一定要和遠(yuǎn)程調(diào)用代碼傳的參數(shù)名一樣 否則接不到參數(shù)。
@RequestMapping(value = "/remoteCallUpload",method = RequestMethod.POST) @ApiOperation("測試遠(yuǎn)程調(diào)用上傳") public String remoteCallUpload(@RequestParam("file") MultipartFile file){ System.out.println(file); return "成功"; }
1.RestTemplate
1.如果用RestTemplate的話首先需要把RestTemplate交給spring去管理所以先來一個(gè)配置類。
2.@SuppressWarnings(“all”) 這個(gè)注解是jdk自帶的的意思是 意志所有的警告。
@Configuration @SuppressWarnings("all") public class RestTemplateConfig { @Autowired RestTemplateBuilder builder; @Bean public RestTemplate restTemplate() { return builder.build(); } }
2.RestTemplate遠(yuǎn)程調(diào)用文件傳輸
這里有幾個(gè)要注意的地方
1.必須重寫否則傳輸時(shí)報(bào)錯(cuò)
ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); } };
2.設(shè)置請(qǐng)求頭因?yàn)榫驮谀M前端發(fā)送上傳文件的請(qǐng)求所以請(qǐng)求頭必須是multipart/form-data
3.第三個(gè)參數(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
以上是注意事項(xiàng)。
@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封裝整個(gè)請(qǐng)求報(bào)文 HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers); String flag = restTemplate.postForObject(url, files, String.class); return flag; }
3.HttpClient
1.使用httpclient的話首先要引入pom文件坐標(biāo)。
<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遠(yuǎn)程調(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é)
遠(yuǎn)程調(diào)用使用了RestTemplate和httpclient也可以使用feign,但是RestTemplate和feign大文件會(huì)OOM,httpclient不會(huì)所以大家可以根據(jù)自己場景去選擇。
到此這篇關(guān)于關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯栴}的文章就介紹到這了,更多相關(guān)springboot MultipartFile文件跨服務(wù)傳輸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用RestTemplate發(fā)送http請(qǐng)求的實(shí)操演示
- SpringBoot使用RestTemplate實(shí)現(xiàn)HTTP請(qǐng)求詳解
- springboot中RestTemplate發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)示例
- springboot中RestTemplate配置HttpClient連接池詳解
- 基于springboot的RestTemplate、okhttp和HttpClient對(duì)比分析
- SpringBoot 利用RestTemplate http測試
- SpringBoot使用RestTemplate如何通過http請(qǐng)求將文件下載到本地
相關(guān)文章
Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法
本篇文章主要介紹了Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08java string 轉(zhuǎn)date方法如何實(shí)現(xiàn)
在開發(fā)應(yīng)用中經(jīng)常會(huì)使用到j(luò)ava string 轉(zhuǎn)date這種不是很常見的做法,本文將以此問題提供詳細(xì)解決方案,需要了解的朋友可以參考下2012-11-11詳解SpringBoot讀取resource目錄下properties文件的常見方式
這篇文章主要介紹了SpringBoot讀取resource目錄下properties文件的常見方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Java實(shí)現(xiàn)微信紅包分配規(guī)則
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)仿微信紅包分配規(guī)則,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02詳細(xì)聊聊SpringBoot中動(dòng)態(tài)切換數(shù)據(jù)源的方法
在大型分布式項(xiàng)目中,經(jīng)常會(huì)出現(xiàn)多數(shù)據(jù)源的情況,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解
這篇文章主要介紹了Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解,在Java中,我們可以通過Executors類來創(chuàng)建ScheduledThreadPool,Executors類提供了幾個(gè)靜態(tài)方法來創(chuàng)建不同類型的線程池,包括ScheduledThreadPool,需要的朋友可以參考下2023-09-09Spring mvc整合tiles框架的簡單入門教程(maven)
這篇文章主要給大家介紹了關(guān)于Spring mvc整合tiles框架的簡單入門教程(maven),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起看看詳細(xì)的介紹吧。2017-12-12