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

Java JDBC 讀取 SQL Server 2000 數據庫中存儲的圖片路徑並輸出圖片文件

     編輯:程式設計綜合問答

業務場景

圖片文件存儲在服務器磁盤目錄,SQL Server 2000 表中僅存儲相對/絕對路徑字符串。Java 應用需讀取路徑,加載圖片流輸出至前端或保存副本。

核心實現步驟

  1. 建立 JDBC 連接(使用 jTDS 或 Microsoft 官方驅動)。
  2. 執行 SELECT pic_path FROM table WHERE id = ? 獲取路徑字符串。
  3. 使用 java.io.FileInputStream 讀取磁盤文件流。
  4. 輸出至 HttpServletResponse.getOutputStream() 或寫入新文件。

完整代碼示例 (Servlet 輸出圖片)


@WebServlet("/showPic")
public class ShowPicServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String picPath = req.getParameter("path"); // 從請求獲取路徑參數
        // 安全校驗:防止目錄遍歷攻擊
        if (picPath == null || picPath.contains("..")) {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }
        
        File imgFile = new File(BASE_UPLOAD_DIR, picPath); // 基礎目錄 + 相對路徑
        if (!imgFile.exists() || !imgFile.isFile()) {
            resp.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        
        resp.setContentType(getContentType(picPath)); // 根據擴展名設置 MIME
        try (InputStream is = new FileInputStream(imgFile);
             OutputStream os = resp.getOutputStream()) {
            byte[] buffer = new byte[4096];
            int len;
            while ((len = is.read(buffer)) != -1) os.write(buffer, 0, len);
        }
    }
    
    private String getContentType(String fileName) {
        if (fileName.endsWith(".png")) return "image/png";
        if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) return "image/jpeg";
        if (fileName.endsWith(".gif")) return "image/gif";
        return "application/octet-stream";
    }
}

關鍵安全提示

  • 絕不直接拼接用戶輸入路徑,必須校驗規範化路徑、限制在允許目錄下,防止 ../../etc/passwd 類攻擊。
  • 大文件建議使用 Files.copy(Path, OutputStream) (NIO.2) 或 sendfile 系統調用(需容器支持)提升性能。
  • SQL Server 2000 已停止主流支持,強烈建議遷移至 SQL Server 2019+ 或 PostgreSQL/MySQL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved