問題記錄
問題描述
我在進行文件上傳時,目錄地址是 "/項目/upload",開始是可以正常上傳的,但是過了一段時間准確的說沒過多久 = =,然后文件就吧唧沒了,當時很納悶,納尼,tomcat還能莫名其妙清除我的文件??
場景重現
好,研究完了nutz提供的文件上傳,來試一下
哇,這里沒改...
好,改好了再試試
哇,這里又沒改...
好,改好了再試試
......
哇,上傳成功了,歐耶~
好,寫其他模塊代碼
哇,404了....
不對啊,文件分明在哪里呢.路徑分明對啊
哇,文件竟然消失了!!!
問題分析
當我們在開發過程中,是需要不斷redeploy的,當你redeploy時你的IDE大概做了這些事情:
1. 重新編譯你寫的代碼,生成classs文件夾
2.將你的項目部署到服務器(在此指tomcat)的webapps目錄下,如果有與將要部署的項目同名的文件夾則會刪除后再部署!!!
3.重新啟動tomcat或者熱部署
嗯.沒錯,你文件上傳完之后文件的確實實在在的在磁盤里,但是當你又寫其他模塊,或者重啟服務器時,那么你的DIE會redeploy,然后你的IDE會檢測到webapps目錄下已經有了這個文件夾,那么它會刪除的它,然后再將最新編譯的代碼部署過去,簡單的說呢,就是替換了~當然 "/項目/upload" 文件夾也被替換了,所以里面的東西都沒了......
解決方案
對頭解決方案:
1.清空/tomcat/webapps/目錄
2.修改/tomcat/conf/web.xml文件:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet
3.修改/tomcat/conf/server.xml文件:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/> --> <!----><Context path="/ser" docBase="D:\project\myProject\editor\WebRoot"></Context> <!--<Context path="/mvc" docBase="D:\project\myProject\你的項目名\WebRoot"></Context>--> </Host>
此方案轉載於: http://blog.csdn.net/sinat_34803353/article/details/53292284
巧妙解決方案:
不將上傳的文件放在本項目下,而放在其他服務器或者當前服務器的其他"安全"的地方.我是這么將文件放在了"/webapps/upload"這里的,跟項目同級別,訪問時就直接 "localhost:8080/upload/java.png"就ok了,對於我們頁面來講,並沒什么影響
String tomcatPath =context.getRealPath("/");//獲取到tomcat位於系統的絕對磁盤路徑,精確到項目下.此為:D:\apache-tomcat-8.0.36\webapps\mychat\ tomcatPath = tomcatPath.substring(0,tomcatPath.length()-1);//此為:D:\apache-tomcat-8.0.36\webapps\mychat tomcatPath = tomcatPath.substring(0,tomcatPath.lastIndexOf("\\"));//此為:D:\apache-tomcat-8.0.36\webapps String relpath = tomcatPath+"\\upload\\"+file.getMeta().getFileLocalName(); // 此為: D:\\apache-tomcat-8.0.36\\webapps\\upload\\tomat.png System.out.println("tomcatPath:"+tomcatPath);
轉載請注明出處