詳解如何使用SpringBoot實現(xiàn)下載JSON文件
概述
在 Spring Boot 中實現(xiàn)文件下載功能,可以通過將 JSON 字符串作為文件內(nèi)容返回給客戶端。以下是實現(xiàn)步驟和代碼示例:
實現(xiàn)步驟
定義接口:創(chuàng)建一個 REST 控制器,用于處理文件下載請求。
設(shè)置響應(yīng)頭:通過 HttpServletResponse 設(shè)置響應(yīng)頭,指定文件類型和下載文件名。
返回文件內(nèi)容:將 JSON 字符串寫入響應(yīng)輸出流。
代碼實現(xiàn)
1. 創(chuàng)建 Spring Boot 控制器
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.nio.charset.StandardCharsets; @RestController @RequestMapping("/api") public class FileDownloadController { @GetMapping("/download-json") public void downloadJsonFile(HttpServletResponse response) throws IOException { // 1. 準(zhǔn)備 JSON 字符串 String jsonContent = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; // 2. 設(shè)置響應(yīng)頭 response.setContentType("application/json"); // 文件類型為 JSON response.setHeader("Content-Disposition", "attachment; filename=\"data.json\""); // 設(shè)置下載文件名 // 3. 將 JSON 字符串寫入響應(yīng)輸出流 response.getOutputStream().write(jsonContent.getBytes(StandardCharsets.UTF_8)); response.getOutputStream().flush(); } }
2. 運(yùn)行并測試
啟動 Spring Boot 應(yīng)用。
在瀏覽器中訪問接口地址,例如:http://localhost:8080/api/download-json。
瀏覽器會自動下載一個名為 data.json 的文件,文件內(nèi)容為:
{"name":"John", "age":30, "city":"New York"}
關(guān)鍵點(diǎn)說明
1.HttpServletResponse:
- 用于設(shè)置響應(yīng)頭和輸出流。
- setContentType("application/json"):指定文件類型為 JSON。
- setHeader("Content-Disposition", "attachment; filename=\"data.json\""):指定文件名為 data.json,并告訴瀏覽器以附件形式下載。
2.文件內(nèi)容寫入:
- 使用 response.getOutputStream().write() 將 JSON 字符串寫入響應(yīng)輸出流。
- 確保使用 StandardCharsets.UTF_8 指定字符編碼,避免亂碼問題。
3.文件名:
可以根據(jù)需要動態(tài)生成文件名,例如:
String fileName = "data_" + System.currentTimeMillis() + ".json"; response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
擴(kuò)展功能
動態(tài)生成 JSON 內(nèi)容:可以從數(shù)據(jù)庫或其他服務(wù)中獲取數(shù)據(jù),動態(tài)生成 JSON 字符串。
壓縮文件下載:如果需要下載壓縮文件(如 .zip),可以使用 ZipOutputStream 將多個文件打包后返回。
大文件下載:對于大文件,可以使用分塊傳輸(Transfer-Encoding: chunked)來優(yōu)化性能。
示例:動態(tài)生成 JSON 內(nèi)容
@GetMapping("/download-dynamic-json") public void downloadDynamicJsonFile(HttpServletResponse response) throws IOException { // 動態(tài)生成 JSON 數(shù)據(jù) Map<String, Object> data = new HashMap<>(); data.put("timestamp", System.currentTimeMillis()); data.put("message", "Hello, this is a dynamic JSON file!"); // 將 Map 轉(zhuǎn)換為 JSON 字符串 String jsonContent = new ObjectMapper().writeValueAsString(data); // 設(shè)置響應(yīng)頭 response.setContentType("application/json"); response.setHeader("Content-Disposition", "attachment; filename=\"dynamic_data.json\""); // 寫入響應(yīng)輸出流 response.getOutputStream().write(jsonContent.getBytes(StandardCharsets.UTF_8)); response.getOutputStream().flush(); }
訪問 http://localhost:8080/api/download-dynamic-json,會下載一個包含動態(tài)生成內(nèi)容的 JSON 文件。
到此這篇關(guān)于詳解如何使用SpringBoot實現(xiàn)下載JSON文件的文章就介紹到這了,更多相關(guān)SpringBoot下載JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中xxl-job實現(xiàn)分片廣播任務(wù)的示例
本文主要介紹了Java中xxl-job實現(xiàn)分片廣播任務(wù)的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03java+mysql模擬實現(xiàn)銀行系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java+mysql模擬實現(xiàn)銀行系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05Java(SpringBoot)項目打包(構(gòu)建)成Docker鏡像的幾種常見方式
在對Spring Boot應(yīng)用程序進(jìn)行Docker化時,為應(yīng)用程序選擇正確的基礎(chǔ)鏡像非常重要,下面這篇文章主要給大家介紹了關(guān)于Java(SpringBoot)項目打包(構(gòu)建)成Docker鏡像的幾種常見方式,需要的朋友可以參考下2023-12-12@RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決
這篇文章主要介紹了@RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04關(guān)于SpringBoot獲取IOC容器中注入的Bean(推薦)
本文通過實例代碼給大家詳解了springboot獲取ioc容器中注入的bean問題,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2018-05-05微信公眾平臺開發(fā)實戰(zhàn)Java版之微信獲取用戶基本信息
這篇文章主要介紹了微信公眾平臺開發(fā)實戰(zhàn)Java版之微信獲取用戶基本信息 的相關(guān)資料,需要的朋友可以參考下2015-12-12基于SpringBoot實現(xiàn)自動裝配返回屬性的設(shè)計思路
這篇文章主要介紹了基于SpringBoot實現(xiàn)自動裝配返回屬性,這里涉及到的技術(shù)知識點(diǎn)有注解解析器,為什么用ResponseBodyAdvice這里解析?不在Filter,Interceptors,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-03-03