欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RestTemplate文件上傳下載與大文件流式下載

 更新時(shí)間:2022年03月17日 10:27:47   作者:字母哥哥  
這篇文章主要為大家介紹了RestTemplate文件上傳下載與大文件流式下載的使用方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步

本文是精講RestTemplate第6篇,前篇的blog訪問地址如下:

RestTemplate在Spring或非Spring環(huán)境下使用精講

RestTemplate實(shí)現(xiàn)多種底層HTTP客戶端類庫(kù)的切換用法

RestTemplate發(fā)送HTTP GET請(qǐng)求使用方法詳解

RestTemplate發(fā)送HTTP POST請(qǐng)求使用方法詳解

RestTemplate的DELETE及PUT等請(qǐng)求方法使用精講

RestTemplate是HTTP客戶端庫(kù),所以為了使用RestTemplate進(jìn)行文件上傳和下載,需要我們先編寫服務(wù)端的支持文件上傳和下載的程序。請(qǐng)參考我之前寫的一篇文章:SpringBoot實(shí)現(xiàn)本地存儲(chǔ)文件上傳及提供HTTP訪問服務(wù) 。按照此文完成學(xué)習(xí)之后,可以獲得

一個(gè)以訪問服務(wù)URI為"/upload”的文件上傳服務(wù)端點(diǎn)

服務(wù)端點(diǎn)上傳文件成功后會(huì)返回一個(gè)HTTP連接,可以用來(lái)下載文件。

下面我們就開始學(xué)習(xí)使用RestTemplate是HTTP客戶端庫(kù),進(jìn)行文件的上傳與下載。

一、文件上傳

寫一個(gè)單元測(cè)試類,來(lái)完成RestTemplate文件上傳功能,具體實(shí)現(xiàn)細(xì)節(jié)參考代碼注釋

@SpringBootTest
class UpDownLoadTests {
   @Resource
   private RestTemplate restTemplate;
   @Test
   void testUpload()  {
      // 文件上傳服務(wù)上傳接口
      String url = "http://localhost:8888/upload";
      // 待上傳的文件(存在客戶端本地磁盤)
      String filePath = "D:\\data\\local\\splash.png";
      // 封裝請(qǐng)求參數(shù)
      FileSystemResource resource = new FileSystemResource(new File(filePath));
      MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
      param.add("uploadFile", resource);  //服務(wù)端MultipartFile uploadFile
      //param.add("param1", "test");   //服務(wù)端如果接受額外參數(shù),可以傳遞
      // 發(fā)送請(qǐng)求并輸出結(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客戶端進(jìn)行下載。

二、文件下載

執(zhí)行下列代碼之后,被下載文件url,會(huì)被正確的保存到本地磁盤目錄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("文件下載請(qǐng)求結(jié)果狀態(tài)碼:" + rsp.getStatusCode());
   // 將下載下來(lái)的文件內(nèi)容保存到本地
   String targetPath = "D:\\data\\local\\splash-down.png";
   Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody(),
               "未獲取到下載文件"));
}

這種下載方法實(shí)際上是將下載文件一次性加載到客戶端本地內(nèi)存,然后從內(nèi)存將文件寫入磁盤。這種方式對(duì)于小文件的下載還比較適合,如果文件比較大或者文件下載并發(fā)量比較大,容易造成內(nèi)存的大量占用,從而降低應(yīng)用的運(yùn)行效率。

三、大文件下載

這種下載方式的區(qū)別在于

設(shè)置了請(qǐng)求頭APPLICATION_OCTET_STREAM,表示以流的形式進(jìn)行數(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";
   //定義請(qǐng)求頭的接收類型
   RequestCallback requestCallback = request -> request.getHeaders()
               .setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));
   //對(duì)響應(yīng)進(jìn)行流式處理而不是將其全部加載到內(nèi)存中
   restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> {
      Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath));
      return null;
   });
}

以上就是RestTemplate文件上傳下載與大文件流式下載的詳細(xì)內(nèi)容,更多關(guān)于RestTemplate大文件流式上傳下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解

    Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解

    這篇文章主要介紹了Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解,當(dāng)在?web.xml?注冊(cè)了一個(gè)?Filter?來(lái)對(duì)某個(gè)?Servlet?程序進(jìn)行攔截處理時(shí),它可以決定是否將請(qǐng)求繼續(xù)傳遞給?Servlet?程序,以及對(duì)請(qǐng)求和響應(yīng)消息是否進(jìn)行修改,需要的朋友可以參考下
    2023-08-08
  • Java Filter過濾器的使用教程

    Java Filter過濾器的使用教程

    Filter也稱之為過濾器,它是Servlet技術(shù)中最實(shí)用的技術(shù),Web開發(fā)人員通過Filter技術(shù),對(duì)web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能
    2023-01-01
  • 詳解Java的橋接方法

    詳解Java的橋接方法

    這篇文章主要介紹了Java 橋接方法的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • springBoot+webMagic實(shí)現(xiàn)網(wǎng)站爬蟲的實(shí)例代碼

    springBoot+webMagic實(shí)現(xiàn)網(wǎng)站爬蟲的實(shí)例代碼

    這篇文章主要介紹了springBoot+webMagic實(shí)現(xiàn)網(wǎng)站爬蟲的實(shí)例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Stream中的Peek操作代碼

    Stream中的Peek操作代碼

    這篇文章主要介紹了Stream中的Peek操作,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • javaweb Servlet開發(fā)總結(jié)(一)

    javaweb Servlet開發(fā)總結(jié)(一)

    Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。這篇文章主要介紹了javaweb Servlet開發(fā)的第一篇,感興趣的小伙伴們可以參考一下
    2016-05-05
  • idea如何將指定目錄打成jar包

    idea如何將指定目錄打成jar包

    這篇文章主要介紹了idea如何將指定目錄打成jar包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

    使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

    保持好的代碼質(zhì)量和遵守編碼標(biāo)準(zhǔn)是開發(fā)可維護(hù)和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來(lái)提高 Spring Boot 應(yīng)用程序的代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下
    2023-10-10
  • Java設(shè)計(jì)模式七大原則之單一職責(zé)原則詳解

    Java設(shè)計(jì)模式七大原則之單一職責(zé)原則詳解

    單一職責(zé)原則(Single Responsibility Principle, SRP),有且僅有一個(gè)原因引起類的變更。簡(jiǎn)單來(lái)說,就是針對(duì)一個(gè)java類,它應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé)。本文將詳細(xì)介紹一下Java設(shè)計(jì)模式七大原則之一的單一職責(zé)原則,需要的可以參考一下
    2022-02-02
  • java 中同步、異步、阻塞和非阻塞區(qū)別詳解

    java 中同步、異步、阻塞和非阻塞區(qū)別詳解

    這篇文章主要介紹了java 中同步、異步、阻塞和非阻塞區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論