問題:在JSP存取伺服器端電腦硬碟內檔案

解法:建立Tomcat的虛擬目錄

環境:STS / Eclipse + Tomcat 7

以下以upload資料夾為例,一般搜尋Tomcat的虛擬目錄設定都會出現類似以下code...
 


在 [Tomcat安裝目錄]\conf\server.xml檔的<host>與</host>之間加入以下程式碼:
<Context path="/upload" reloadable="true" docBase="D:\upload" />

但這段在 Tomcat7 已經不適用了,要改成到
[Tomcat安裝目錄]\conf\Catalina\localhost 下新增 upload.xml 檔案

 

內容:
<Context path="/upload" reloadable="true" docBase="D:\upload" />


內容和舊版相同,但注意xml的檔名要和path名相同
(也就是說以前path可以設定成/project/upload,現在不行了...)

設定成功的話可以在Tomcat Web Application Manager中看到upload資料夾列在清單裡

undefined

接著只要網址打上 localhost/upload/[檔案名]
就可以存取伺服器端 D:\upload\[檔案名] 的檔案

-------------------------
以上設定可以在server上成功存取,
但如果是開發模式中透過Eclipse啟動Tomcat則會出現404 error
HTTP Status 404 - /upload/
The requested resource (/upload/) is not available.

原因是Eclipse並不存取 [Tomcat安裝目錄]\conf 下的設定
必須到它的發佈路徑下設置這些conf才會被讀取到
(我是使用Spring Tool Studio,STS本體還是Eclipse所以也一樣)
例如此時的發佈路徑是
D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
那我們就必須去
D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\Catalina\localhost
下新增上述那個 upload.xml,就可以成功存取

P.S. 那個 D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
就是Eclispe使用的Tomcat資料夾,取得路徑的方式是
在Eclispe內對server點右鍵,選Browse Deployment Location


2016-05-04更新:

Tomcat8又換回和 Tomcat6一樣的方式
(Tomcat安裝路徑)/conf/server.xml的<Host>和</Host>之間加上

<Context path="/upload" docBase="D:\uploadFiles" reloadable="true"/>

就可以了,不過要注意 docBase 的路徑存在 (資料夾要先開好),不然會出現以下錯誤

 [main] org.apache.coyote.AbstractProtocol.destroy Failed to destroy end point associated with ProtocolHandler ["ajp-nio-8099"]
 java.lang.NullPointerException
    at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:305)
    at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:481)
    at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:831)
    at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:533)
    at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023)
(下略)

相關文章