精講RestTemplate第6篇-文件上傳下載與大文件流式下載

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

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

  • 一個以訪問服務(wù)URI為"/upload”的文件上傳服務(wù)端點
  • 服務(wù)端點上傳文件成功后會返回一個HTTP連接,可以用來下載文件茧跋。

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

一瘾杭、文件上傳

寫一個單元測試類诅病,來完成RestTemplate文件上傳功能,具體實現(xiàn)細節(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";

      // 封裝請求參數(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ā)送請求并輸出結(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)存的大量占用,從而降低應(yīng)用的運行效率次坡。

三呼猪、大文件下載

這種下載方式的區(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));
   //對響應(yīng)進行流式處理而不是將其全部加載到內(nèi)存中
   restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> {
      Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath));
      return null;
   });
}

歡迎關(guān)注我的博客乡革,里面有很多精品合集

  • 本文轉(zhuǎn)載注明出處(必須帶連接,不能只轉(zhuǎn)文字):字母哥博客

覺得對您有幫助的話沸版,幫我點贊嘁傀、分享!您的支持是我不竭的創(chuàng)作動力视粮! 细办。另外,筆者最近一段時間輸出了如下的精品內(nèi)容蕾殴,期待您的關(guān)注笑撞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钓觉,隨后出現(xiàn)的幾起案子茴肥,更是在濱河造成了極大的恐慌,老刑警劉巖荡灾,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓤狐,死亡現(xiàn)場離奇詭異,居然都是意外死亡批幌,警方通過查閱死者的電腦和手機础锐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荧缘,“玉大人皆警,你說我怎么就攤上這事〗卮郑” “怎么了信姓?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桐愉。 經(jīng)常有香客問我财破,道長,這世上最難降的妖魔是什么从诲? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮靡羡,結(jié)果婚禮上系洛,老公的妹妹穿的比我還像新娘。我一直安慰自己略步,他們只是感情好描扯,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趟薄,像睡著了一般绽诚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天恩够,我揣著相機與錄音卒落,去河邊找鬼。 笑死蜂桶,一個胖子當(dāng)著我的面吹牛儡毕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扑媚,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼腰湾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疆股?” 一聲冷哼從身側(cè)響起费坊,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旬痹,沒想到半個月后附井,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡唱凯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年羡忘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕昼。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷雕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出票从,到底是詐尸還是另有隱情漫雕,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布峰鄙,位于F島的核電站浸间,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吟榴。R本人自食惡果不足惜魁蒜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吩翻。 院中可真熱鬧兜看,春花似錦、人聲如沸狭瞎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊锭。三九已至弧轧,卻和暖如春雪侥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背精绎。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工速缨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捺典。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓鸟廓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親襟己。 傳聞我的和親對象是個殘疾皇子引谜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容