天天看點

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

👨‍🎓作者:bug菌

✏️部落格:CSDN​、掘金等

💌公衆号:​​猿圈奇妙屋​​

🚫特别聲明:原創不易,轉載請附上原文出處連結和本文聲明,謝謝配合。

🙏版權聲明:文章裡可能部分文字或者圖檔來源于網際網路或者百度百科,如有侵權請聯系bug菌處理。

一、前言🔥

       接下來的這幾期,bug菌想跟大家分享一下自己昨天剛接到一個臨時的需求,熱乎着呢,想分享一下自己是如何面對臨時需求并制定整個開發周期,其中包括從梳理業務到建立業務表再到實作業務邏輯形成閉環再到與前端對接,其中會穿插一些業務拓展及功能性拓展,這一條龍流程線上與大家一起見證,分享給剛入門的小夥伴,希望對你們有所幫助。

環境說明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8

       若小夥伴們在批閱文章的過程中覺得文章對您有一絲絲幫助,還請别吝啬您手裡的贊呀,大膽的把文章點亮👍吧,您的點贊三連(收藏⭐️+關注👨‍🎓+留言📃)就是對bug菌我創作道路上最好的鼓勵與支援😘。時光不棄🏃🏻‍♀️,創作不停💕,加油☘️ 

二、正文🔥

        這一期,我接着還是圍繞圖檔為準,既然要教學,那就要把圖檔的增删改查一環不落的都講述完畢。這樣對于日後的你們而言,如果有遇到涉及圖檔相關的業務,那你們便毫無壓力,直接按照我這一套教程,我手把手的教你,這肯定是最快且最優的零基礎入門教學了,說不定還能得到上司的大賞識,工作嘛,不就圖個代碼安全且工作高效,能早些下班,盡量在工作時間内完成當天的工作量,這是所有人奮鬥的目标,是你的也是我的。

        咱們就廢話不多說,直接開始今天的内容。

三、如何代碼實作圖檔下載下傳🔥

        咱們今天的内容就是實作圖檔下載下傳,既然業務支援圖檔上傳,那就一定要支援圖檔的本地下載下傳,那如何實作圖檔從伺服器下載下傳到本地呢?這顯然是個問題啊?不過今天有我,我從零到一帶着大家完整的從分析到實作再到測試,一條龍服務式的把你們都安排的妥妥的。

1️⃣定義Controller請求

        我們先來定義好接口請求,先分析一下,圖檔既然要下載下傳,肯定是要找到圖檔的全路徑才行,是以對于該業務接口,入參肯定還是需要兩個參數,入參1圖檔全名,例如test.jpg,入參2域賬号id,因為要想把圖檔資源位址全路徑拼接完全,這肯定是需要根據域賬号id來作為子路徑拼接,這也跟業務定義有關,你們也可以不區分到人,把所有的圖檔資源放在一個大資源池就行,我就是因為需要将人分檔案夾上傳,至需要某人上傳所儲存的域賬号id作為前置條件。

        既然分析完了入參,那麼接口定義也就有眉目了,大家請看。僅供參考:

@GetMapping("/download-img-by-path")
    @ApiOperation(value = "圖檔下載下傳", notes = "根據圖檔位址進行圖檔下載下傳")
    public void downloadImgByPath(@ApiParam("圖檔路徑") @RequestParam("imgPath") String imgPath,
                                  @ApiParam("回報人的域賬号id") @RequestParam("accountId") throws      

需要注意的是,你接口請求路徑,最好要做到見名知意,這樣也友善日後在頁面調試區分接口請求。

2️⃣定義downloadImgByPath()接口

        接着我們就要在service接口層定義該downloadImgByPath()方法了。

void downloadImgByPath(String imgPath, String accountId) throws      

3️⃣實作downloadImgByPath()方法

        接下來就是該接口的核心所在了,但這裡,我們為了日後避免代碼備援,這裡我們還是将該圖檔下載下傳方法封裝成一個公共方法,這樣對于一些圖檔下載下傳啊,pdf下載下傳等檔案,就直接調用即可,那我們封裝,最主要的就是資源儲存路徑了,是以,入參就給個口子,按資源路徑進行資源下載下傳。

具體代碼實作如下:

@Override
    public void downloadImgByPath(String imgPath, String accountId) throws IOException {

        //拼接預覽圖檔全路徑
        String targetPath = this.buildImgPath(imgPath, accountId);
        //調用下載下傳方法      

對于圖檔路徑拼接方法,就是根據你實際業務而定,把該資源的儲存路徑拼接全就可以了。然後對于圖檔核心方法我也是封裝到了uploader執行器裡了,裡頭涉及的都是一些資源的上傳下載下傳等公用方法。 

4️⃣實作圖檔downloadImg()下載下傳方法

        具體怎麼去實作圖檔資源的下載下傳,這就需要借助到一個工具了,IOUtils工具類,它有提供一個流指派的方法copyLarge(),大家可以看下它的源碼,有興趣的小夥伴可以去琢磨一下。

public static long copyLarge(InputStream input, OutputStream output) throws IOException {
        return copy(input, output, 4096);
}      

而 copyLarge()方法也是實作圖檔資源下載下傳的重要一步,具體如何結合使用,請看bug菌寫的核心方法,僅供參考。

/**
     * 圖檔下載下傳
     */
    public void downloadImg(String targetPath) {

        FileInputStream inputStream = null;

        HttpServletResponse response = SpringServletContextUtils.getResponse();
        try {

            //設定檔案頭,最後一個參數是設定下載下傳檔案名
            response.setHeader("Content-Disposition", "attachment;fileName=" + FilenameUtils.getName(targetPath));

            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 {
            //關流      
線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

        該方法非常的簡短,唯獨要暴露出來的就是資源的全路徑,這得由調用者确定下來,如果資源不存在,肯定是會下載下傳失敗的。 

5️⃣接口測試

        接着我們就來進行圖檔下載下傳測試了,這裡也涉及一個很重要的一環,如果你是接口未加入白名單,那肯定是涉及token登入鑒權的,是以為了安全起見,我将該接口調用設定了接口不攔截白名單,即我直接就可以通過浏覽器請求位址即可進行圖檔資源的下載下傳了。

        或者你也可以使用postman進行接口調試,也是支援圖檔下載下傳功能的,具體我就在下方給大家都示範一遍吧。

方式一:浏覽器測試圖檔下載下傳

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

首先你要保證該圖檔資源是存在的啊,比如我這裡,我是確定該圖檔存在,給大家看下。

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

圖檔全路徑這個大家必須保證是能找到資源的,否則打開肯定是個空白圖檔的。就如下圖所示:

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

而正确位址,圖檔下載下傳下來,打開,準确來說肯定是你指定下載下傳的那張圖檔的。

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

方式二:postman測試圖檔下載下傳 

        選擇send可以直接預覽該圖檔,但我們要的是圖檔從伺服器儲存到本地,即我們就下拉【Send】選擇【Send and download】選項即會跳轉打開一個本地儲存的視窗,我就選擇儲存到桌面吧。

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

我是直接儲存到桌面了,大家可以看看,檔案預設報錯命名是會被改成response,不是按原名下載下傳儲存的不過通過浏覽器下載下傳是不會有這樣的問題發生。

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

6️⃣總結

        相對而言,還是一步到位,沒遇到什麼bug,這個實測功能可用,大家可以放心copy哈。

 ... ...

        好啦,以上就是這期的所有内容啦,你們學廢了麼?如果對你有所幫助,還請不要忘記給bug菌[三連支援]喲。如果想獲得更多的學習資源或者想和更多的技術愛好者一起交流,可以關注我的公衆号『​​猿圈奇妙屋​​』,背景回複關鍵詞領取學習資料、大廠面經、面試模闆等海量資源,就等你來拿。

四、往期熱文推薦🔥

        對于問題回報子產品實戰開發,我完整的梳理了每一期的教學及連結位址,僅供參考:希望能對你們有所幫助。

  • 線上問題回報子產品實戰(一):梳理業務需求并建立資料庫表
  • 線上問題回報子產品實戰(二):封裝代碼自動生成類檔案器
  • 線上問題回報子產品實戰(三):自動生成所有Controller、Service、Mapper等檔案
  • 線上問題回報子產品實戰(四):封裝通用字段類
  • 線上問題回報子產品實戰(五):實作對通用字段内容自動填充功能
  • 線上問題回報子產品實戰(六):接口文檔定義
  • 線上問題回報子產品實戰(七):安裝部署swagger2
  • 線上問題回報子產品實戰(八):實作圖檔上傳功能-上篇
  • 線上問題回報子產品實戰(九):實作圖檔上傳功能-下篇
  • 線上問題回報子產品實戰(十):實作圖檔預覽功能
  • 線上問題回報子產品實戰(十一):實作圖檔下載下傳功能
  • 線上問題回報子產品實戰(十二):實作圖檔删除功能
  • 線上問題回報子產品實戰(十三):實作多參數分頁查詢清單
  • 線上問題回報子產品實戰(十四):實作線上答疑功能
  • 線上問題回報子產品實戰(十五):實作線上更新回報狀态功能
  • 線上問題回報子產品實戰(十六):實作查詳情功能
  • 線上問題回報子產品實戰(十七):實作excel模闆線上下載下傳功能
  • 線上問題回報子產品實戰(十八):實作excel台賬檔案記錄批量導入功能
  • 線上問題回報子產品實戰(十九):實作資料批量導出到excel檔案中功能
  • 線上問題回報子產品實戰(二十):實作檔案批量導出到zip壓縮包中功能
  • 線上問題回報子產品實戰(二十一):完結篇

        如上是整整二十期内容,每一期都是幹貨,對于一個子產品的開發,如何一點一滴打造并測試部署上線,我再說一遍,這不是演習,是實戰!是實戰!是實戰!

        若你們覺得隻是需要了解其中某個知識點或者業務的話,也不反對,你就選擇其中的幾期進行學習就好,反正都已經完結啦;我隻希望你們能有所收獲,有所成長,也就不枉我苦心每天下班後給大家總結更新。

五、文末🔥

《springboot零基礎入門教學》,都是我一手打下的江山,持續更新中,希望能幫助到更多小夥伴們。

       我是bug菌,一名想走👣出大山改變命運的程式猿。接下來的路還很長,都等待着我們去突破、去挑戰。來吧,小夥伴們,我們一起加油!未來皆可期,fighting!

        最後送大家兩句我很喜歡的話,與諸君共勉!

☘️做你想做的人,沒有時間限制,隻要願意,什麼時候都可以start。

🍀你能從現在開始改變,也可以一成不變,這件事,沒有規矩可言,你可以活出最精彩的自己。

線上問題回報子產品實戰(十一)​:實作圖檔下載下傳功能

💌如果文章對您有所幫助,就請留下您的贊吧!(#^.^#);

💝如果喜歡bug菌分享的文章,就請給bug菌點個關注吧!(๑′ᴗ‵๑)づ╭❤~;

繼續閱讀