上傳文件后自動刪除問題記錄


問題記錄

問題描述

  我在進行文件上傳時,目錄地址是 "/項目/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);

 

  轉載請注明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM