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

JSP 從資料庫讀取二進位資料流動態輸出圖片完整指南

     編輯:關於JSP

在 Web 應用中,圖片常儲存於資料庫 BLOB 欄位。JSP 需以 response.getOutputStream() 輸出二進位流,並正確設定 Content-Type,瀏覽器才能正確渲染。本文梳理核心步驟與易踩的坑。

核心程式碼範例(Oracle 為例)

<%@ page import="java.sql.*,java.io.*" %>
<%
    int len = 10 * 1024 * 1024; // 10MB 緩衝
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    Connection conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@10.168.8.99:1521:orafy", "lhzy", "qwertyuiop");
    Statement stmt = conn.createStatement(
        ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    ResultSet rs = stmt.executeQuery("SELECT pic FROM test");
    rs.next(); // 必須先定位到第一筆
    InputStream in = rs.getBinaryStream(1); // 索引從 1 開始

    response.reset();
    response.setContentType("image/jpeg"); // 或 image/png, image/gif
    OutputStream toClient = response.getOutputStream();

    byte[] buf = new byte[len];
    int readBytes;
    while ((readBytes = in.read(buf)) != -1) {
        toClient.write(buf, 0, readBytes);
    }
    in.close();
    toClient.flush();
    toClient.close(); // 關閉輸出流,否則後續 response 可能失效
    rs.close(); stmt.close(); conn.close();
%>

兩大關鍵注意點

  1. ResultSet 必須先呼叫 next():游標初始位於第一筆之前,直接 getBinaryStream 會拋異常;欄位索引從 1 起算,非 0。
  2. 務必關閉 OutputStream:若同一請求中多處呼叫 response.getOutputStream() 卻未關閉前一個,後續呼叫會失敗。良習:用完即 close(),並在 finally 區塊釋放資料庫資源。

實務建議

  • 生產環境請使用連線池(如 HikariCP),避免每請求建立連線。
  • 大圖片建議分塊讀寫,避免記憶體飆升。
  • 若圖片頻繁被存取,考慮快取至檔案系統或 CDN,降低 DB 壓力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved