本文是精講RestTemplate第6篇,前篇的blog訪問地址以下:html
RestTemplate是HTTP客戶端庫,因此爲了使用RestTemplate進行文件上傳和下載,須要咱們先編寫服務端的支持文件上傳和下載的程序。請參考我以前寫的一篇文章:SpringBoot實現本地存儲文件上傳及提供HTTP訪問服務 。按照此文完成學習以後,能夠得到vue
下面咱們就開始學習使用RestTemplate是HTTP客戶端庫,進行文件的上傳與下載。java
寫一個單元測試類,來完成RestTemplate文件上傳功能,具體實現細節參考代碼註釋spring
@SpringBootTest class UpDownLoadTests { @Resource private RestTemplate restTemplate; @Test void testUpload() { // 文件上傳服務上傳接口 String url = "http://localhost:8888/upload"; // 待上傳的文件(存在客戶端本地磁盤) String filePath = "D:\\data\\local\\splash.png"; // 封裝請求參數 FileSystemResource resource = new FileSystemResource(new File(filePath)); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("uploadFile", resource); //服務端MultipartFile uploadFile //param.add("param1", "test"); //服務端若是接受額外參數,能夠傳遞 // 發送請求並輸出結果 System.out.println("--- 開始上傳文件 ---"); String result = restTemplate.postForObject(url, param, String.class); System.out.println("--- 訪問地址:" + result); } }
輸出結果以下:後端
--- 開始上傳文件 --- --- 訪問地址:http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png
文件上傳以後,能夠經過上面的訪問地址,在瀏覽器訪問。或者經過RestTemplate客戶端進行下載。瀏覽器
執行下列代碼以後,被下載文件url,會被正確的保存到本地磁盤目錄targetPath。springboot
@Test void testDownLoad() throws IOException { // 待下載的文件地址 String url = "http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png"; ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class); System.out.println("文件下載請求結果狀態碼:" + rsp.getStatusCode()); // 將下載下來的文件內容保存到本地 String targetPath = "D:\\data\\local\\splash-down.png"; Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody(), "未獲取到下載文件")); }
這種下載方法其實是將下載文件一次性加載到客戶端本地內存,而後從內存將文件寫入磁盤。這種方式對於小文件的下載還比較適合,若是文件比較大或者文件下載併發量比較大,容易形成內存的大量佔用,從而下降應用的運行效率。併發
這種下載方式的區別在於前後端分離
@Test void testDownLoadBigFile() throws IOException { // 待下載的文件地址 String url = "http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png"; // 文件保存的本地路徑 String targetPath = "D:\\data\\local\\splash-down-big.png"; //定義請求頭的接收類型 RequestCallback requestCallback = request -> request.getHeaders() .setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL)); //對響應進行流式處理而不是將其所有加載到內存中 restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> { Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath)); return null; }); }
以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。微服務