springmvc文件下載


文件下載就是將文件服務器中的文件下載到本地,在springmvc中要實現文件下載可分為兩個步驟:

第一步:在客戶端使用一個文件下載超鏈接,鏈接里面的href屬性指向后台下載文件的方法以及文件名;

第二步:在后台controller類中,使用springmvc提供的文件下載方法進行下載。

springmvc提供了一個ResponseEntity類型的對象,使用它可以很方便的定義返回的HttpHeaders對象和HttpStatus對象,通過對這兩個對象的設置,即可完成下載文件時所需的配置信息。文件下載的代碼如下所示:

  public ResponseEntity<byte[]> downFile(HttpServletRequest request, String filename) throws IOException {

        //指定要下載的文件所在路徑
        String path = request.getServletContext().getRealPath("/upload/");
        //創建該文件對象
        File file = new File(path + File.separator + filename);
        //設置響應頭
        HttpHeaders headers = new HttpHeaders();
        //通知瀏覽器以下載的方式打開文件
        headers.setContentDispositionFormData("attachment", filename);
        //定義以流的形式下載返回文件數據
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        //使用springmvc框架的ResponseEntity對象封裝返回數據
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    }

說明:在downFile方法中,首先根據文件路徑和需要下載的文件名來創建文件對象,然后對響應頭中文件下載時的打開方式以及下載方式進行了設置,最后返回ResponseEntity封裝的下載結果對象。MediaType.APPLICATION_OCTET_STREAM 表示以二進制流的形式下載數據。

對於中文名稱的文件名亂碼處理:

如果文件名是英文的則不會出現文件名亂碼的情況,但是如果文件名中有中文,則可能出現亂碼,這個時候需要對文件名進行轉碼處理。如下所示:

public ResponseEntity<byte[]> downFile(HttpServletRequest request, String filename) throws IOException {

        //指定要下載的文件所在路徑
        String path = request.getServletContext().getRealPath("/upload/");
        //創建該文件對象
        File file = new File(path + File.separator + filename);
    
        //對文件名進行編碼,防止中文文件名亂碼
        filename = this.getFilename(request, filename);

        //設置響應頭
        HttpHeaders headers = new HttpHeaders();
        //通知瀏覽器以下載的方式打開文件
        headers.setContentDispositionFormData("attachment", filename);
        //定義以流的形式下載返回文件數據
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        //使用springmvc框架的ResponseEntity對象封裝返回數據
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    }

    /**
     * 根據瀏覽器的不同進行編碼設置
     *
     * @param request  請求對象
     * @param filename 需要轉碼的文件名
     * @return 返回編碼后的文件名
     * @throws IOException
     */
    public String getFilename(HttpServletRequest request, String filename) throws IOException {

        //IE不同版本User-Agent中出現的關鍵詞
        String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
        
        //獲取請求頭代理信息
        String userAgent = request.getHeader("User-Agent");
        for (String keyWord : IEBrowserKeyWords) {
            if (userAgent.contains(keyWord)) {
                //IE內核瀏覽器,統一為utf-8編碼顯示
                return URLEncoder.encode(filename, "UTF-8");
            }
        }

        //火狐等其他瀏覽器統一為ISO-8859-1編碼顯示
        return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
    }

以上就是springmvc的文件下載內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM