RestTemplate文件上傳下載與大文件流式下載
本文是精講RestTemplate第6篇,前篇的blog訪問(wèn)地址如下:
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èn)服務(wù) 。按照此文完成學(xué)習(xí)之后,可以獲得
一個(gè)以訪問(wèn)服務(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("--- 訪問(wèn)地址:" + result);
}
}
輸出結(jié)果如下:
--- 開始上傳文件 ---
--- 訪問(wèn)地址:http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png
文件上傳之后,可以通過(guò)上面的訪問(wèn)地址,在瀏覽器訪問(wèn)?;蛘咄ㄟ^(guò)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)文章
Java簡(jiǎn)易計(jì)算器程序設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易計(jì)算器程序設(shè)計(jì)的相關(guān)參考資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-10-10
java 全角半角字符轉(zhuǎn)換的方法實(shí)例
這篇文章主要介紹了java 全角半角字符轉(zhuǎn)換的方法,大家參考使用吧2013-11-11
IDEA常用插件之類Jar包搜索Maven Search解讀
文章介紹了IDEA常用插件MavenSearch的使用方法,該插件可以幫助用戶快速查找和瀏覽Maven中央存儲(chǔ)庫(kù)中可用的依賴項(xiàng)和插件,方便用戶管理項(xiàng)目依賴項(xiàng)2025-01-01
Maven依賴中scope的runtime和provied的區(qū)別及說(shuō)明
這篇文章主要介紹了Maven依賴中scope的runtime和provied的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Springboot使用zxing實(shí)現(xiàn)二維碼生成和解析
ZXing支持各種條形碼,二維碼掃描,由多個(gè)模塊組成,?而且支持PC端,移動(dòng)端,本文將利用zxing實(shí)現(xiàn)二維碼生成和解析,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10

