RestTemplate文件上傳下載與大文件流式下載
本文是精講RestTemplate第6篇,前篇的blog訪問地址如下:
RestTemplate在Spring或非Spring環(huán)境下使用精講
RestTemplate實現(xiàn)多種底層HTTP客戶端類庫的切換用法
RestTemplate發(fā)送HTTP GET請求使用方法詳解
RestTemplate發(fā)送HTTP POST請求使用方法詳解
RestTemplate的DELETE及PUT等請求方法使用精講
RestTemplate是HTTP客戶端庫,所以為了使用RestTemplate進行文件上傳和下載,需要我們先編寫服務端的支持文件上傳和下載的程序。請參考我之前寫的一篇文章:SpringBoot實現(xiàn)本地存儲文件上傳及提供HTTP訪問服務 。按照此文完成學習之后,可以獲得
一個以訪問服務URI為"/upload”的文件上傳服務端點
服務端點上傳文件成功后會返回一個HTTP連接,可以用來下載文件。
下面我們就開始學習使用RestTemplate是HTTP客戶端庫,進行文件的上傳與下載。
一、文件上傳
寫一個單元測試類,來完成RestTemplate文件上傳功能,具體實現(xiàn)細節(jié)參考代碼注釋
@SpringBootTest class UpDownLoadTests { @Resource private RestTemplate restTemplate; @Test void testUpload() { // 文件上傳服務上傳接口 String url = "http://localhost:8888/upload"; // 待上傳的文件(存在客戶端本地磁盤) String filePath = "D:\\data\\local\\splash.png"; // 封裝請求參數(shù) FileSystemResource resource = new FileSystemResource(new File(filePath)); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("uploadFile", resource); //服務端MultipartFile uploadFile //param.add("param1", "test"); //服務端如果接受額外參數(shù),可以傳遞 // 發(fā)送請求并輸出結(jié)果 System.out.println("--- 開始上傳文件 ---"); String result = restTemplate.postForObject(url, param, String.class); System.out.println("--- 訪問地址:" + result); } }
輸出結(jié)果如下:
--- 開始上傳文件 ---
--- 訪問地址:http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png
文件上傳之后,可以通過上面的訪問地址,在瀏覽器訪問。或者通過RestTemplate客戶端進行下載。
二、文件下載
執(zhí)行下列代碼之后,被下載文件url,會被正確的保存到本地磁盤目錄targetPath。
@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("文件下載請求結(jié)果狀態(tài)碼:" + rsp.getStatusCode()); // 將下載下來的文件內(nèi)容保存到本地 String targetPath = "D:\\data\\local\\splash-down.png"; Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody(), "未獲取到下載文件")); }
這種下載方法實際上是將下載文件一次性加載到客戶端本地內(nèi)存,然后從內(nèi)存將文件寫入磁盤。這種方式對于小文件的下載還比較適合,如果文件比較大或者文件下載并發(fā)量比較大,容易造成內(nèi)存的大量占用,從而降低應用的運行效率。
三、大文件下載
這種下載方式的區(qū)別在于
設(shè)置了請求頭APPLICATION_OCTET_STREAM,表示以流的形式進行數(shù)據(jù)加載
RequestCallback 結(jié)合File.copy保證了接收到一部分文件內(nèi)容,就向磁盤寫入一部分內(nèi)容。而不是全部加載到內(nèi)存,最后再寫入磁盤文件。
@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)); //對響應進行流式處理而不是將其全部加載到內(nèi)存中 restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> { Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath)); return null; }); }
以上就是RestTemplate文件上傳下載與大文件流式下載的詳細內(nèi)容,更多關(guān)于RestTemplate大文件流式上傳下載的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot中使用Filter實現(xiàn)Header認證詳解
這篇文章主要介紹了Springboot中使用Filter實現(xiàn)Header認證詳解,當在?web.xml?注冊了一個?Filter?來對某個?Servlet?程序進行攔截處理時,它可以決定是否將請求繼續(xù)傳遞給?Servlet?程序,以及對請求和響應消息是否進行修改,需要的朋友可以參考下2023-08-08springBoot+webMagic實現(xiàn)網(wǎng)站爬蟲的實例代碼
這篇文章主要介紹了springBoot+webMagic實現(xiàn)網(wǎng)站爬蟲的實例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05javaweb Servlet開發(fā)總結(jié)(一)
Servlet是sun公司提供的一門用于開發(fā)動態(tài)web資源的技術(shù)。這篇文章主要介紹了javaweb Servlet開發(fā)的第一篇,感興趣的小伙伴們可以參考一下2016-05-05使用Java反射機制提高SpringBoot的代碼質(zhì)量和可維護性
保持好的代碼質(zhì)量和遵守編碼標準是開發(fā)可維護和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來提高 Spring Boot 應用程序的代碼質(zhì)量和可維護性,需要的朋友可以參考下2023-10-10