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

Java EE Servlet 實現圖片下載:Response 輸出流與 Content-Disposition 標頭完整處理

     編輯:Java 綜合教學

Java EE Servlet 實現圖片下載:Response 輸出流與 Content-Disposition 標頭完整處理

預設情況下瀏覽器會嘗試直接顯示圖片,若需觸發「另存為」下載對話框,必須正確設定 HTTP 回應標頭。本文示範 Servlet 中圖片下載的完整流程,含中文檔名編碼處理。

核心步驟

  1. 獲取 FileInputStream 讀取圖片(路徑用 getServletContext().getRealPath() 解析)。
  2. 獲取 ServletOutputStream 寫入回應。
  3. 設定 Content-Disposition: attachment; filename=... 強制下載。
  4. 中文檔名必須 URL 編碼(URLEncoder.encode),避免 ISO-8859-1 亂碼。
  5. 輸入流關閉,輸出流不要關閉(由容器管理)。

完整代碼實現

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1. 設定下載標頭,處理中文檔名
    String fileName = "測試.jpg";
    String encodedName = URLEncoder.encode(fileName, "UTF-8");
    resp.setHeader("Content-Disposition", "attachment;filename=" + encodedName);

    // 2. 獲取圖片輸入流
    String realPath = getServletContext().getRealPath("/1.jpg");
    try (FileInputStream fis = new FileInputStream(realPath)) {
        // 3. 獲取輸出流
        ServletOutputStream os = resp.getOutputStream();
        
        // 4. 流拷貝
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        os.flush();
        // 注意:此處不關閉 os,由容器統一管理
    }
}

關鍵細節對比

操作直接顯示觸發下載
Content-Disposition無 / inlineattachment; filename=xxx
中文檔名瀏覽器自行猜測編碼必須 URLEncoder.encode(UTF-8)
輸出流關閉容器管理容器管理(勿手動關閉)

瀏覽器彈出下載對話框截圖

進階補充

  • 大檔案支援: 設定 Content-Length、啟用 BufferedInputStream、考慮 Transfer-Encoding: chunked。
  • 斷點續傳: 需處理 Range 請求標頭,返回 206 Partial Content。
  • 安全性: 驗證檔案路徑防止目錄遍歷攻擊,限制允許下載的檔案類型/目錄。

掌握 Response 輸出流與標頭控制,是 Java Web 檔案下載功能的核心基礎。

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