Web 專案中常需讀取服務器磁盤絕對路徑 (如 /data/uploads/, D:\images\) 下的圖片/文件,但 Web 應用預設僅能訪問部署目錄 (webapps/專案) 內資源。本文詳解 Tomcat Context 虛擬目錄映射配置,實現 JSP <img> 直接引用外部絕對路徑資源。
path (訪問路徑前綴) 和 docBase (物理資源路徑)/uploads/xxx.jpg 映射到磁盤 D:/data/uploads/xxx.jpg文件位置:$CATALINA_HOME/conf/server.xml
找到 <Host> 元素 (通常為 name="localhost"),在 </Host> 之前添加 <Context>:
| 屬性 | 說明 | 範例值 |
|---|---|---|
path | URL 訪問路徑前綴,**必須以 / 開頭**,不以 / 結尾 | /uploads, /images, /files |
docBase | 服務器絕對物理路徑,**使用正斜槓 /** 跨平台兼容 | D:/data/uploads, /home/user/files |
reloadable | 開發環境 true (熱加載),生產環境 false (效能) | true / false |
allowLinking | Linux/macOS 允許符號鏈接 (軟連接),Windows 忽略 | true / false |
# Linux/macOS $CATALINA_HOME/bin/shutdown.sh $CATALINA_HOME/bin/startup.sh # Windows %CATALINA_HOME%\bin\shutdown.bat %CATALINA_HOME%\bin\startup.bat
<%-- 映射配置:path="/uploads" docBase="D:/data/uploads" --%>![]()
<%-- 相對域名根路徑 --%> <%-- 若配置 path="/static" --%>
若不想修改全局 server.xml,可在專案中定義:
文件:src/main/webapp/META-INF/context.xml
優點:隨專案部署遷移、不影響其他專案、版本控制友好。
缺點:專案重新部署時需重啟生效、多專案共享需重複配置。
@Configuration
public class TomcatConfig {
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addContextCustomizers(context -> {
// 添加虛擬目錄映射
context.getResources().createWebResourceSet(
WebResourceRoot.ResourceSetType.PRE,
"/uploads", // webAppMount
"D:/data/uploads", // base (物理路徑)
"/"
);
});
return factory;
}
}
或 application.yml:
server:
servlet:
context-path: /myapp
tomcat:
basedir: /tmp/tomcat
# Spring Boot 2.5+ 支持
resources:
- pattern: /uploads/**
location: file:D:/data/uploads/
靜態資源直接由 Nginx 服務,不經 Tomcat,效能更優:
# nginx.conf
server {
listen 80;
server_name example.com;
location /uploads/ {
alias /data/uploads/; # 直接映射磁盤路徑
expires 30d;
add_header Cache-Control "public";
}
location / {
proxy_pass https://localhost:8080; # 轉發動態請求給 Tomcat
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
| 現象 | 原因 | 解決 |
|---|---|---|
| 圖片 404 Not Found | path/docBase 不匹配、路徑大小寫 (Linux 區分大小寫) | 檢查 server.xml 配置、實際磁盤路徑、URL 大小寫 |
| 圖片顯示為破圖圖標 | 無讀取權限、文件損壞、MIME 類型錯誤 | chmod 755 目錄、chmod 644 文件、檢查 Tomcat MIME 映射 |
| 修改 server.xml 不生效 | 編輯錯誤文件、未重啟 Tomcat、Context 路徑衝突 | 確認 $CATALINA_HOME/conf/server.xml、完全重啟、路徑唯一 |
| Windows 路徑反斜槓問題 | XML 中反斜槓需轉義或使用正斜槓 | 統一使用正斜槓 D:/data/uploads |
| Spring Boot 內嵌 Tomcat 不生效 | 配置類未掃描、ResourceSet 參數錯誤 | @Configuration 掃描、檢查 WebResourceRoot API 用法 |
web.xml 設置 listings=false (預設)valid_referers 或 Tomcat Filter 檢查 Referer