基於SSM框架的使用MultipartFile實現文件的下載

關於單個文件或多個文件的上傳,上一篇博文已經記錄了下來,這次聊聊文件的下載。

                                                                                                                                            ——@Yelihu2018年9月20日 23:35:58

    文件的下載還依然是使用MultipartFile這個組件,關於相關配置文件的配置,上一篇博文已經記錄,這裏就不在多贅述

功能實現的效果是,進入一個網頁的頁面,出來一個下載框,就可以下載一個指定的文件,這個文件暫時存放在本地的E盤之下,

實際開發的時候,關於文件的路徑和文件的名稱,還是要設置爲可配置的路徑和動態獲取的文件名,比如從數據庫中讀取出文件名和文件路徑,這個Demo裏面僅爲設置了讀取文件的路徑爲E盤。

代碼如下:

 @RequestMapping(value="/downloadtest")
    public String downloadtest(HttpServletResponse response){

        //設置字符編碼
        response.setCharacterEncoding("UTF-8");

        //通過輸出流寫到客戶端
        //獲取文件名字(全名+後綴)(實際開發中應該設置爲從數據庫中動態獲取)
        String fileName = "2018線性代數輔導講義(湯家鳳) (1)1537405630070.pdf";

        //通過Paths工具類獲取一個path對象
        Path path = Paths.get(parentPath,fileName);

        //判斷文件是否存在
        if(Files.exists(path)){
            System.out.println("文件存在!");
            //存在就下載
            //通過response設定他的相應類型
            //獲取文件後綴
            String fileSuffix =fileName.substring(fileName.lastIndexOf(".")+1);

            //設置contentType,指定該響應類型 即可下載
            response.setContentType("application/"+fileSuffix);

            //重要!:根據HTTP協議的規範,添加頭信息,影響瀏覽器執行下載的行爲
            try {
                response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            //通過path寫入文件
            try {
                Files.copy(path,response.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }


        }

        //跳轉到響應頁面
        return "system/plansubmit/download_success";
    }
  1. 首先要字符編碼,不然會出現下載的文件文件名中中文部分爲空格。
    response.setCharacterEncoding("UTF-8");
  2. 獲取文件名,我這裏直接定死了是E盤路徑下,叫做"2018線性代數輔導講義(湯家鳳) (1)1537405630070.pdf"的pdf文件
  3. 通過Path獲取一個path對象構造一個Path對象來表示一個文件路徑,或者一個文件。
  4. 截取文件名稱的前綴(不包括.pdf部分)
  5. 判斷文件存在之後,根據HTTP協議所指定的響應類型(response.setContentType("application/"+fileSuffix);)
  6. 重要:根據HTTP協議的規範,添加頭信息,影響瀏覽器執行下載的行爲(response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1")); )
  7. 通過files下載文件

 

至此,在跳轉到的頁面上已經完全能下載到一個存在在E盤的這個指定的pdf文件了。

重點:響應類型的指定,和頭信息的指定

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章