👨🎓作者:bug菌
✏️部落格:CSDN、掘金等
💌公衆号:猿圈奇妙屋
🚫特别聲明:原創不易,轉載請附上原文出處連結和本文聲明,謝謝配合。
🙏版權聲明:文章裡可能部分文字或者圖檔來源于網際網路或者百度百科,如有侵權請聯系bug菌處理。
一、概述🔥
接下來的這幾期,bug菌想跟大家分享一下自己昨天剛接到一個臨時的需求,熱乎着呢,想分享一下自己是如何面對臨時需求并制定整個開發周期,其中包括從梳理業務到建立業務表再到實作業務邏輯形成閉環再到與前端對接,其中會穿插一些業務拓展及功能性拓展,這一條龍流程線上與大家一起見證,分享給剛入門的小夥伴,希望對你們有所幫助。
環境說明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8
若小夥伴們在批閱文章的過程中覺得文章對您有一絲絲幫助,還請别吝啬您手裡的贊呀,大膽的把文章點亮👍吧,您的點贊三連(收藏⭐️+關注👨🎓+留言📃)就是對bug菌我創作道路上最好的鼓勵與支援😘。時光不棄🏃🏻♀️,創作不停💕,加油☘️
二、正文🔥
時光荏苒,本子產品開發任務也即将接近尾聲。帶着大家做了将近快20期的子產品全業務開發,不知道你們收獲大不大,反正對于自己,我是察覺到了自己還有很多知識點掌握的不夠熟練,需要好好惡補呀,路還很長,咱們一起努力。
對于這期,我要帶着大家手把手教學,如何實作excel模闆檔案如何從伺服器中下載下傳到本地?就對于這麼個業務場景,想必大家并不陌生,那麼來吧,八仙過海各顯神通。看看大家都對此有何不同的實作方法。
那麼,請大家都放馬過來吧。
三、如何代碼實作excel模闆下載下傳🔥
1️⃣定義Controller請求
既然确定了業務場景為下載下傳excel模闆,也就是從伺服器下載下傳資源,那好吧,還是老樣子,先确定請求格式。比如請求入參,傳回參類型,請求路徑等。
具體請求定義如下:
/**
* 問題回報excel模闆下載下傳
*/
@GetMapping("/download-model")
@ApiOperation(value = "問題回報excel模闆下載下傳", notes = "問題回報excel模闆下載下傳")
public void download()
2️⃣定義接口方法downLoad()
由于沒有傳回值,是以直接void即可。
/**
* excel模闆下載下傳
*/
void download();
3️⃣實作downLoad()方法
我是将該template路徑配置于yaml配置檔案中了,也友善日後測試環境、正式環境修改其儲存路徑即可。
//擷取template絕對路徑
@Value("${review.file.template}")
private String templatePath;
/**
* excel模闆下載下傳
*/
@Override
public void download() {
//絕對目錄位址
String target = templatePath + "問題回報導入模闆.xlsx";
uploader.downloadExcel(target);
}
由于我是直接放在了目前本地項目的template檔案夾下,你們也可以随意指定路徑。我為了給大家示範,我就指定了本地excel的存放路徑了。
給大家看一眼我示範項目excel模闆存放位置:僅供參考。
具體excel下載下傳核心代碼實作如下:
/**
* excel下載下傳
*/
public void downloadExcel(String targetPath) {
FileInputStream inputStream = null;
HttpServletResponse response = SpringServletContextUtils.getResponse();
try {
//設定檔案頭,最後一個參數是設定下載下傳檔案名
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(FilenameUtils.getName(targetPath), StandardCharsets.UTF_8.name()));
File file = new File(targetPath);
inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
IOUtils.copyLarge(inputStream, outputStream);
outputStream.flush();
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
//關流
而且我注意到如果用浏覽器請求,肯定是無法設定請求頭的,是以我将該接口加到了我的common子產品中,該子產品有做白名單免token鑒權處理,在其子產品下的所有接口都不會被token登入鑒權器所攔截,是以對于我接口模闆導出測試就非常友善了。因為我注意到如果通過postman測試導出,下載下傳到本地會是一個.zip的檔案,是以暫時放棄了用postman做測試工具。
如下我是直接選擇用浏覽器進行接口請求測試。直接通路浏覽器輸入請求位址即可。
接着我們來debug一下,看看我們所傳入的target目标路徑是否正确且存在?
如下截圖我确定是真實存在且确定是excel模闆存放位置。你們也要檢查一下,路徑有問題也肯定不會實作檔案下載下傳成功的。
去掉斷點,直接運作結束,可以看下,浏覽器直接彈出下載下傳,我檢查了下,雖檔案内容格式等都是對的,但是其檔案名亂碼,這肯定不行。到底是啥原因導緻?那又該如何解決呢?
分析問題得出,對于中文讀取的時候不給編碼,它可能就用别的編碼(不一定适合中文),就會導緻中文亂碼。是以想讀取中文,你就得寫明編碼格式。
是以給出的解決方案就是在對設定寫入excel檔案名時,明确編碼格式。如何指定呢?這就用到了這個函數:URLEncoder.encode(String s, String enc),該方法能将使用指定的編碼機制将字元串轉換為 application/x-www-form-urlencoded 格式,其格式
也
是浏覽器預設的編碼格式。那在上述代碼中,你隻需要這麼改就行。
具體修改代碼如下:
// response.setHeader("Content-Disposition", "attachment;fileName=" + FilenameUtils.getName(targetPath));
response.setHeader("Content-Disposition", "attachment;filename="
4️⃣接口測試
指定編碼後我們重新開機項目,我們再來試一下。經測試,導出的檔案名是中文展示了。我們再來檢查一下導出的excel檔案内容是否也存在亂碼問題?經檢查一切正常。
說明上述代碼已ok!可供業務使用。也供小夥伴們一鍵copy。
附上,postman測試導出功能,卻檔案名依舊亂碼!
大家請看:
我是選擇該【Send and Download】選項,一般是用于對接口有檔案下載下傳導出功能所用。
我選擇儲存到本地桌面後,打開檔案,内容格式都沒問題,但是就是檔案名亂碼了。
至于這個問題,我暫時沒有想到好的解決方案,這兒先放着,等我想到了解決方案再來修複這一塊的bug。你們就暫時按浏覽器的方式進行檔案下載下傳測試導出就好了。
5️⃣總結
對于越簡單的邏輯接口而言,我們都要百分百用心寫。
... ...
好啦,以上就是這期的所有内容啦,你們學廢了麼?如果對你有所幫助,還請不要忘記給bug菌[三連支援]喲。如果想獲得更多的學習資源或者想和更多的技術愛好者一起交流,可以關注我的公衆号『猿圈奇妙屋』,背景回複關鍵詞領取學習資料、大廠面經、面試模闆等海量資源,就等你來拿。
四、往期熱文推薦🔥
對于問題回報子產品實戰開發,我完整的梳理了每一期的教學及連結位址,僅供參考:希望能對你們有所幫助。
- 線上問題回報子產品實戰(一):梳理業務需求并建立資料庫表
- 線上問題回報子產品實戰(二):封裝代碼自動生成類檔案器
- 線上問題回報子產品實戰(三):自動生成所有Controller、Service、Mapper等檔案
- 線上問題回報子產品實戰(四):封裝通用字段類
- 線上問題回報子產品實戰(五):實作對通用字段内容自動填充功能
- 線上問題回報子產品實戰(六):接口文檔定義
- 線上問題回報子產品實戰(七):安裝部署swagger2
- 線上問題回報子產品實戰(八):實作圖檔上傳功能-上篇
- 線上問題回報子產品實戰(九):實作圖檔上傳功能-下篇
- 線上問題回報子產品實戰(十):實作圖檔預覽功能
- 線上問題回報子產品實戰(十一):實作圖檔下載下傳功能
- 線上問題回報子產品實戰(十二):實作圖檔删除功能
- 線上問題回報子產品實戰(十三):實作多參數分頁查詢清單
- 線上問題回報子產品實戰(十四):實作線上答疑功能
- 線上問題回報子產品實戰(十五):實作線上更新回報狀态功能
- 線上問題回報子產品實戰(十六):實作查詳情功能
- 線上問題回報子產品實戰(十七):實作excel模闆線上下載下傳功能
- 線上問題回報子產品實戰(十八):實作excel台賬檔案記錄批量導入功能
- 線上問題回報子產品實戰(十九):實作資料批量導出到excel檔案中功能
- 線上問題回報子產品實戰(二十):實作檔案批量導出到zip壓縮包中功能
- 線上問題回報子產品實戰(二十一):完結篇
如上是整整二十期内容,每一期都是幹貨,對于一個子產品的開發,如何一點一滴打造并測試部署上線,我再說一遍,這不是演習,是實戰!是實戰!是實戰!
若你們覺得隻是需要了解其中某個知識點或者業務的話,也不反對,你就選擇其中的幾期進行學習就好,反正都已經完結啦;我隻希望你們能有所收獲,有所成長,也就不枉我苦心每天下班後給大家總結更新。
五、文末🔥
《springboot零基礎入門教學》,都是我一手打下的江山,持續更新中,希望能幫助到更多小夥伴們。
我是bug菌,一名想走👣出大山改變命運的程式猿。接下來的路還很長,都等待着我們去突破、去挑戰。來吧,小夥伴們,我們一起加油!未來皆可期,fighting!
最後送大家兩句我很喜歡的話,與諸君共勉!
☘️做你想做的人,沒有時間限制,隻要願意,什麼時候都可以開始。
🍀你能從現在開始改變,也可以一成不變;這件事,沒有規矩可言,你可以活出最精彩的自己。
💌如果文章對您有所幫助,就請留下您的贊吧!(#^.^#);
💝如果喜歡bug菌分享的文章,就請給bug菌點個關注吧!(๑′ᴗ‵๑)づ╭❤~;
💗如果對文章有任何疑問,還請文末留言或者加群吧【QQ交流群:708072830】;