首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 文件下載兩大實現:原生 Servlet 與 Spring MVC 最佳實踐

     編輯:Java 綜合教學

Java 文件下載兩大實現:原生 Servlet 與 Spring MVC 最佳實踐

一、 原生 Servlet 二進制流下載

public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String filePath = request.getSession().getServletContext().getRealPath("/apk/android/NCB.apk");
    File file = new File(filePath);
    if (!file.exists()) return;

    String fileName = URLEncoder.encode(file.getName(), "UTF-8");
    response.reset();
    response.setContentType(request.getServletContext().getMimeType(fileName));
    response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
    response.setContentLength((int) file.length());

    try (InputStream in = new FileInputStream(file);
         ServletOutputStream out = response.getOutputStream()) {
        byte[] buf = new byte[4096];
        int len;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
        }
    }
}

二、 Spring MVC + Commons IO 精簡版

public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {
    String path = request.getSession().getServletContext().getRealPath("");
    File file = new File(path + "\\file\\template\\模板文件.xls");

    String userAgent = request.getHeader("User-Agent");
    byte[] bytes = userAgent.contains("MSIE") ? file.getName().getBytes() : file.getName().getBytes("UTF-8");
    String fileName = new String(bytes, "ISO-8859-1");

    response.setContentType("multipart/form-data");
    response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));

    try (InputStream in = new FileInputStream(file)) {
        IOUtils.copy(in, response.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

三、 關鍵點對比

維度原生 ServletSpring MVC + IOUtils
代碼量手動管理流、緩衝區、異常IOUtils.copy/closeQuietly 一行搞定
中文文件名URLEncoder.encodeUser-Agent 區分 IE/非 IE 編碼策略 + ISO-8859-1 轉碼
資源釋放finally 手動關閉Try-with-resources / closeQuietly
適用場景無 Spring 環境、需精細控制Spring 項目、追求簡潔健壯

四、 通用最佳實踐

  • 設置 Content-Disposition: attachment; filename=... 強制瀏覽器下載而非預覽。
  • 設置 Content-Length 支援下載進度條。
  • 大文件建議啟用 BufferedInputStream/OutputStream 或 NIO FileChannel.transferTo 零拷貝。
  • 生產環境加入範圍請求(Range)支援斷點續傳。

Spring MVC 專案首選 IOUtils.copy 方案,代碼少、異常安全、中文文件名兼容性好;非 Spring 環境參考原生寫法並補全資源釋放邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved