SpringBoot+HttpClient實現文件上傳下載

服務端:SpringBoot

Controller

package com.liliwei.controller;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;import javax.servlet.http.HttpServletResponse;import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
public class TestController {@RequestMapping("/upload")@ResponseBodypublic String testUpload(@RequestParam("file") MultipartFile file) throws IOException {String originalFilename = file.getOriginalFilename();file.transferTo(new File("E://upload/" + originalFilename));return "文件上傳成功";}@RequestMapping("/download/{fileName:.+}")public ResponseEntity<byte[]> testDownload(HttpServletResponse response, @PathVariable("fileName") String fileName) {byte[] bytes = getFile("E://upload/" + fileName);HttpHeaders headers = new HttpHeaders();headers.setContentDispositionFormData("attachment", fileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);return responseEntity;}public static byte[] getFile(String filePath) {File f = new File(filePath);FileInputStream fis = null;byte[] data = null;try {fis = new FileInputStream(f);data = new byte[fis.available()];fis.read(data);} catch (Exception e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (Exception e) {}}}return data;}
}

application.yml

server:port: 9000# application.yml
spring:servlet:multipart:# 設置單個文件上傳的最大值(比如50MB)max-file-size: 1000MB# 設置請求的最大總體大小(比如100MB)max-request-size: 1000MB

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.studio</groupId><artifactId>SpringBootTest</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.18</version></dependency><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.3.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
</project>

客戶端:Apache HttpClient

代碼

package com;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.entity.mime.FileBody;
import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.message.StatusLine;public class HttpClient {/*** 文件下載*/public static void download(String targetUrl, String localFile) throws Exception {try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {final HttpGet httpget = new HttpGet(targetUrl);System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());final byte[] result = httpclient.execute(httpget, response -> {System.out.println("----------------------------------------");System.out.println(httpget + "->" + new StatusLine(response));return EntityUtils.toByteArray(response.getEntity());});FileOutputStream fos = new FileOutputStream(new File(localFile));fos.write(result);fos.close();}}/*** 文件上傳*/public static void upload(String localFile, String targetUrl) {CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;try {httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(targetUrl);FileBody fileBody = new FileBody(new File(localFile));HttpEntity httpEntity = MultipartEntityBuilder.create().addPart("file", fileBody).build();httpPost.setEntity(httpEntity);response = httpClient.execute(httpPost);HttpEntity resEntity = response.getEntity();if (resEntity != null) {System.err.println("服務器響應數據:" + EntityUtils.toString(resEntity));}EntityUtils.consume(resEntity);} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {if (httpClient != null) {httpClient.close();}} catch (IOException e) {e.printStackTrace();}}}
}

測試

package com;import org.junit.Test;public class TestHttpClient {@Testpublic void testUpload() {// 本地文件上傳到遠程HttpClient.upload("E://Empty_P1.pdf", "http://localhost:9000/upload");}@Testpublic void testDownload() throws Exception {// 下載遠程文件到本地String fileName = "Empty_P1.pdf";HttpClient.download("http://localhost:9000/download/" + fileName, "E://download/" + fileName);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45997.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cesium 判斷位置是否在當前視口范圍內

詳細步驟都在注釋里,不過多贅述了。 /*** @param {Object} position - Cartesian3坐標* @return {Boolean} 是否在視口中*/ function isPositionInViewport(position) {// 獲取當前視口范圍let viewport = viewer.camera.computeViewRectangle();// 2D模式下拾取不到坐標,vi…

類和對象的簡述(c++篇)

開局之前&#xff0c;先來個小插曲&#xff0c;放松一下&#xff1a; 讓我們的熊二來消滅所有bug 各位&#xff0c;在這祝我們&#xff1a; 放松過后&#xff0c;開始步入正軌吧。愛學習的鐵子們&#xff1a; 目錄&#xff1a; 一類的定義&#xff1a; 1.簡述&#xff1a; 2…

【JavaScript 算法】貪心算法:局部最優解的構建

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 一、貪心算法的基本概念貪心算法的適用場景 二、經典問題及其 JavaScript 實現1. 零錢兌換問題2. 活動選擇問題3. 分配問題 三、貪心算法的應用四、總結 貪心算法&#xff08;Greedy Algorithm&#xff09;是一種逐步構建解…

mybatisPlus和mybatis的版本沖突問題、若依換成MP、解決git無法推送、使用若依框架的swagger、以后再遇到團隊項目應該怎么做。

20240716 一. mybatisPlus和mybatis的版本沖突問題1. 使用前的準備2. 我遇到了一個很嚴重的問題。3. 解決問題&#xff0c;好吧也沒解決&#xff0c;發現問題&#xff01;&#xff01; 二、該死的git&#xff01;&#xff01;&#xff01;&#xff01;1. 解決無法在idea中使用g…

【Outlook】從Outlook新版回歸經典版全攻略

引言 在微軟宣布計劃于2024年底淘汰郵件應用&#xff08;Mail app&#xff09;之后&#xff0c;許多用戶發現新版Outlook應用&#xff08;Outlook (new)&#xff09;在他們的Windows 11/10系統上自動啟動。如果您更傾向于使用經典版Outlook&#xff08;Outlook (classic)&…

webpack優化

優化方向 熱更新 概念 /** hmr: hot module replacement 熱模塊替換 / 模塊熱更新作用&#xff1a; 一個模塊發生改變&#xff0c;只會重新打包這一個模塊&#xff08;而不是打包所有模塊&#xff09;&#xff0c;極大的提升了構建速度樣式文件&#xff1a; 可以使用hmr功能…

Facebook:數字時代的社交瑰寶

在當今數字化飛速發展的時代&#xff0c;社交媒體已經成為人們日常生活中不可或缺的一部分&#xff0c;而Facebook作為其中的領軍者&#xff0c;不僅連接了全球數十億的用戶&#xff0c;更深刻地改變了人們的社交方式和生活方式。本文將探討Facebook如何成為數字時代的社交瑰寶…

python如何創建SQLite 數據庫連接,如何將數據庫存儲在內存中?

嗨&#xff0c;大家好&#xff0c;我是蘭若姐姐。今天給大家說下如何創建SQLite 數據庫連接,并將數據庫存儲在內存中,這是一種臨時的、私有的數據存儲空間&#xff0c;一般用于以下情形&#xff1a; 什么都不說&#xff0c;先上代碼&#xff1a; import sqlite3創建數據庫連接…

再談有關JVM中的四種引用

1.強引用 強引用就是我們平時使用最多的那種引用&#xff0c;就比如以下的代碼 //創建一個對象 Object obj new Object();//強引用 這個例子就是創建了一個對象并建立了強引用&#xff0c;強引用一般就是默認支持的當內存不足的時候&#xff0c;JVM開始垃圾回收&#xff0c…

防火墻的冗余基礎知識+實驗檢測

將之前先理清需要注意的知識點&#xff1a; 1、注意防火墻冗余時的會話表必須保持一致&#xff0c;這里HRP技術已經做到 2、vrrp是自動開啟搶占的&#xff0c;且是根據優先級進行搶占的 3、免費ARP的作用&#xff1a;告訴交換機的某個IP的mac地址變成了我的這個mac地址 4、HRP …

C++ | Leetcode C++題解之第231題2的冪

題目&#xff1a; 題解&#xff1a; class Solution { private:static constexpr int BIG 1 << 30;public:bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0;} };

強化學習——多臂老虎機問題(MAB)【附python代碼】

文章目錄 一、問題描述1.1 問題定義1.2 形式化描述1.3 累積懊悔1.4 估計期望獎勵 二、解決方法2.1 ?-貪婪算法2.2 上置信界算法2.3 湯普森采樣算法2.4 小結 一、問題描述 1.1 問題定義 有一個用于 K 根拉桿的老虎機&#xff0c;每一根拉桿都對應一個關于獎勵的概率分布 R 。每…

【C++題解】1154. 數組元素的查找

問題&#xff1a;1154. 數組元素的查找 類型&#xff1a;數組找數 題目描述&#xff1a; 給你 m 個整數&#xff0c;查找其中有無值為 n 的數&#xff0c;有則輸出該數第一次出現的位置,沒有則輸出 ?1 。 輸入&#xff1a; 第一行一個整數 m 代表數的個數 ( 0≤m≤100 ) 。…

Qt基礎 | Qt全局定義 | qglobal頭文件中的數據類型、函數、宏定義

文章目錄 一、數據類型定義二、函數三、宏定義 QtGlobal頭文件包含了 Qt 類庫的一些全局定義 &#xff0c;包括基本數據類型、函數和宏&#xff0c;一般的Qt類的頭文件都會包含該文件。 詳細內容可參考&#xff1a;https://doc.qt.io/qt-5/qtglobal.html 一、數據類型定義 為了…

數據可視化在智慧醫療中的重要應用

在現代智慧醫療的推動下&#xff0c;數據可視化技術正日益成為醫療領域的重要工具。通過將復雜的醫療數據轉換為直觀的圖表和圖形&#xff0c;數據可視化不僅提升了醫療服務的效率&#xff0c;還極大地改善了患者的就醫體驗。 在智慧醫療中&#xff0c;數據可視化首先在電子病歷…

客流統計系統優化景區服務流程,增強游客滿意度

在當今旅游業蓬勃發展的時代&#xff0c;景區面臨著越來越多的挑戰和機遇。如何提供更優質、更高效的服務&#xff0c;滿足游客日益增長的需求&#xff0c;成為了景區管理者們關注的焦點。客流統計系統作為一種創新的技術手段&#xff0c;正逐漸成為優化景區服務流程、增強游客…

MySQL主從同步的原理與思考

摘要 分析主從同步出現的原因&#xff0c;MySQL實現主從同步的原理&#xff0c;思考實現原理的局限性和優點 背景 在實際應用中主從同步常用于實現備份、負載均衡和高可用。數據冗余的目的是提高數據的安全性&#xff0c;避免因磁盤損壞導致數據丟失的問題。讀寫分離的目的是…

ubuntu系統Docker常用命令

1.查看docker是否開機啟動 sudo systemctl list-unit-files | grep enable|grep docker 2.設置開機啟動 sudo systemctl enable docker 3.關閉docker開機啟動 sudo systemctl disable docker 4.開啟docker服務 sudo service docker start 5.關閉docker服務 sudo servi…

基于CNN的MINIST手寫數字識別項目代碼以及原理詳解

文章目錄 項目簡介項目下載地址項目開發軟件環境項目開發硬件環境前言一、數據加載的作用二、Pytorch進行數據加載所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加載項目需要使用的庫 三、加載MINIST數據集3.1 數據集簡介3.2 數據預處理3.3 加載數據集 四…

2.10、matlab中字符、數字、矩陣、字符串和元胞合并為字符串并將字符串以不同格式寫入讀出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的數據類型&#xff08;字符、數字、矩陣、字符串和元胞&#xff09;合并為字符串&#xff0c;然后將字符串以不同格式寫入 Excel 文件。 以下是一個示例代碼&#xff0c;展示如何將不同數據類型合并為字符串&#xff0c;并以不…