日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

精讲RestTemplate第6篇-文件上传下载与大文件流式下载

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 精讲RestTemplate第6篇-文件上传下载与大文件流式下载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

  • 精講RestTemplate第1篇-在Spring或非Spring環境下如何使用
  • 精講RestTemplate第2篇-多種底層HTTP客戶端類庫的切換
  • 精講RestTemplate第3篇-GET請求使用方法詳解
  • 精講RestTemplate第4篇-POST請求方法使用詳解
  • 精講RestTemplate第5篇-DELETE、PUT等請求方法使用詳解

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

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

下面我們就開始學習使用RestTemplate是HTTP客戶端庫,進行文件的上傳與下載。

一、文件上傳

寫一個單元測試類,來完成RestTemplate文件上傳功能,具體實現細節參考代碼注釋

@SpringBootTest class UpDownLoadTests {@Resourceprivate RestTemplate restTemplate;@Testvoid 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。

@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(),"未獲取到下載文件")); }

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

三、大文件下載

這種下載方式的區別在于

  • 設置了請求頭APPLICATION_OCTET_STREAM,表示以流的形式進行數據加載
  • RequestCallback 結合File.copy保證了接收到一部分文件內容,就向磁盤寫入一部分內容。而不是全部加載到內存,最后再寫入磁盤文件。
@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;}); }

總結

以上是生活随笔為你收集整理的精讲RestTemplate第6篇-文件上传下载与大文件流式下载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。