Play1.2.4 實現專案檔案和上傳檔案分離
專案現狀: 兩臺伺服器通過nfs共享public目錄, public 目錄存js,css ,圖片等檔案,這部分檔案經常有增加,更新的需求,偶爾有刪除的需求,其實並沒有執行過刪除操作,不想更新部分檔案時,就會將整個public更新到伺服器上去,雖然花費時間長,但是十分省事。 使用者上傳的檔案儲存在public/upload 目錄下, 通過 aaa.com/public/ 來訪問專案的靜態資源。
關於 upload 目錄的一些限制,
1: 有時我想刪除整個public,然後重新上傳,但是由於upload的存在,不管public存在多少多餘的檔案,我都不敢刪除public。
2: 上傳整個public目錄時,總擔心 upload 目錄的檔案被本地測試檔案替換,雖然本地upload和線上upload 存在同名檔案的概率很小。
3: 關於把專案名稱改改,部署到另外一個目錄,或者新增一個例項的想法都不敢有,操作起來太麻煩。如果是使用tomcat來進行部署更是一種災難。
/opt/xfyh/apache-tomcat-7.0.94/webapps/ROOT/WEB-INF/application/public/upload。 雖然我知道你可能會說 tomcat 和 war 分離
<Context path="" docBase="/usr/local/tomcat-f/war/app.war"></Context> ,但是前面兩個問題還是會存在。
因此將專案檔案和使用者上傳檔案分離開還是十分必要的。 解決辦法也無非就是將upload 目錄移到專案外面去, 具體做法如下:
1: 配置 routes 檔案
將所有的 /upload/xxx 請求mapping 到 UploadController.index 上面去。
2: UploadController.index 處理邏輯如下,主要在於找到檔案的絕對路徑。
3: 上傳檔案時的處理: 將tmp目錄的檔案 copy 到 uploadPath 目錄中去及可。
相應的spring的解決方案:
想比較而言 spirng 的解決方案更加靈活,因為spring的解決方案能新增任意多個靜態資源目錄。
關於其他play的不足之處:
1: 需要程式設計師手動的刪除檔案